`

Java反射讲解

    博客分类:
  • Java
阅读更多

1、反射简介

Java的反射机制是Java特性之一,反射机制是构建框架技术的基础所在。灵活掌握Java反射机制,对大家以后学习框架技术有很大的帮助。


Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。


2、反射使用示例

2.1创建Person类,代码如下:

package com.xieke.reflect;

public class Person
{
    private String name;  
    private int age;

    public String getName()
    {
        return name;
    }

    public void setName(String name)
    {
        this.name = name;
    }

    public int getAge()
    {
        return age;
    }

    public void setAge(int age)
    {
        this.age = age;
    }

    @Override
    public String toString()
    {
        return "[" + this.name + "  " + this.age + "]";
    }

    public Person()
    {

    }

    public Person(String name)
    {
        this.name = name;
    }

    public Person(int age)
    {
        this.age = age;
    }

    public Person(String name, int age)
    {
        this.age = age;
        this.name = name;
    }
}  

 2.2测试代码如下:

package com.xieke.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

/**
 * 测试Class类
 * 
 * @author junhu
 */
@SuppressWarnings("unused")
public class MainClass
{
    public static void main(String[] args)
    {
        // testOne();

        // testTwo();

        // testThree();

        // testFour();

        // testFive();
    }

    /**
     * 通过Class获得其他类的所有属性和方法
     */
    private static void testFive()
    {
        Class<?> demo = null;
        try
        {
            demo = Class.forName("com.xieke.reflect.Person");
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }

        System.out.println("===============本类属性========================");
        // 取得本类的全部属性
        Field[] field = demo.getDeclaredFields();
        for (int i = 0; i < field.length; i++)
        {
            // 权限修饰符
            int mo = field[i].getModifiers();
            String priv = Modifier.toString(mo);
            // 属性类型
            Class<?> type = field[i].getType();
            System.out.println(priv + " " + type.getName() + " " + field[i].getName() + ";");
        }

        System.out.println("===============本类方法========================");
        Method method[] = demo.getMethods();
        for (int i = 0; i < method.length; ++i)
        {
            Class<?> returnType = method[i].getReturnType();
            Class<?> para[] = method[i].getParameterTypes();
            int temp = method[i].getModifiers();
            System.out.print(Modifier.toString(temp) + " ");
            System.out.print(returnType.getName() + "  ");
            System.out.print(method[i].getName() + " ");
            System.out.print("(");
            for (int j = 0; j < para.length; ++j)
            {
                System.out.print(para[j].getName() + " " + "arg" + j);
                if (j < para.length - 1)
                {
                    System.out.print(",");
                }
            }
            Class<?> exce[] = method[i].getExceptionTypes();
            if (exce.length > 0)
            {
                System.out.print(") throws ");
                for (int k = 0; k < exce.length; ++k)
                {
                    System.out.print(exce[k].getName() + " ");
                    if (k < exce.length - 1)
                    {
                        System.out.print(",");
                    }
                }
            }
            else
            {
                System.out.print(")");
            }
            System.out.println();
        }
    }

    /**
     * 通过Class调用其他类中的构造函数
     */
    private static void testFour()
    {
        Class<?> demo = null;
        try
        {
            demo = Class.forName("com.xieke.reflect.Person");
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        Person per1 = null;
        Person per2 = null;
        Person per3 = null;
        Person per4 = null;
        // 取得全部的构造函数
        Constructor<?> cons[] = demo.getConstructors();
        try
        {
            per1 = (Person) cons[0].newInstance();
            per2 = (Person) cons[1].newInstance("xieke");
            per3 = (Person) cons[2].newInstance(20);
            per4 = (Person) cons[3].newInstance("xieke", 20);
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        System.out.println(per1);
        System.out.println(per2);
        System.out.println(per3);
        System.out.println(per4);
    }

    /**
     * 通过Class调用其他类的无参构造实例化对象
     */
    private static void testThree()
    {
        Class<?> demo = null;
        try
        {
            demo = Class.forName("com.xieke.reflect.Person");
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        Person per = null;
        try
        {
            per = (Person) demo.newInstance();
        }
        catch (InstantiationException e)
        {
            e.printStackTrace();
        }
        catch (IllegalAccessException e)
        {
            e.printStackTrace();
        }
        per.setName("xieke");
        per.setAge(22);
        System.out.println(per);
    }

    /**
     * 通过一个对象获得完整的包名和类名
     */
    private static void testOne()
    {
        Person person = new Person();
        System.out.println(person.getClass().getName());// 获得完整的包名和类名
        System.out.println(person.getClass().getSimpleName());// 获得类名
    }

    /**
     * 实例化Class类对象
     */
    private static void testTwo()
    {
        Class<?> class1 = null;
        Class<?> class2 = null;
        Class<?> class3 = null;
        try
        {
            // 一般尽量采用这种形式
            class1 = Class.forName("com.xieke.reflect.Person");
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        class2 = new Person().getClass();
        class3 = Person.class;

        System.out.println("类名称   " + class1.getName());
        System.out.println("类名称   " + class2.getName());
        System.out.println("类名称   " + class3.getName());
    }
}

 

3、测试效果自己动手试一试,我就不把测试结果贴出来了,详细代码见我的码云

 

 

 

1
0
分享到:
评论

相关推荐

    JAVA反射详细讲解

    从原理讲解反射技术,及其作用,是不可多得的上手教程

    JAVA反射机制详解视频

    (通过反射获取无参构造方法并使用) (通过反射获取带参构造方法并使用) (通过反射获取私有构造方法并使用) (通过反射获取成员变量并使用) (通过反射获取无参无返回值成员方法并使用) (通过反射获取带参带返回值成员...

    java基础之反射讲解

    java基础之反射讲解

    Java反射的ppt

    解析Java反射技术讲解如何将字符串变成java中的对象

    JAVA -讲解反射机制

    1、JAVA 讲解反射机制,基本使用介绍,原理分析; 1、JAVA 讲解反射机制,基本使用介绍,原理分析; 1、JAVA 讲解反射机制,基本使用介绍,原理分析; 1、JAVA 讲解反射机制,基本使用介绍,原理分析; 1、JAVA 讲解...

    java反射机制讲解

    这是我自己地java反射机制的总结,在学习饿过程中自己的看法,以及学习的记录,希望能够帮助到大家!

    Java反射机制的学习

    Java反射机制的学习 对java反射机制进行详细的讲解

    java反射机制讲解与应用举例

    关于java反射机制的很好的讲解,包括Java的反射机制(Reflection)、Class类、如何获得类的相关信息和运用,并且还有相应的练习,有助于更好地学习java反射机制

    Java反射技术的一般应用

    在向学生讲解Class.forName()方法的使用时,有时需要扩展讲解为什么这样书写的原理,于是,扩展讲解Java反射技术可以查看被监视类的方法(构造方法和普通方法)、公有属性的功能,以达到封闭功能的效果。该例子使用...

    java反射技术ppt

    详细讲解了java反射技术,简单易懂,可以很轻松的学习java的反射机制

    java反射技术讲解

    Java反射机制主要提供了以下功能: l 在运行时判断任意一个对象所属的类; l 在运行时构造任意一个类的对象; l 在运行时判断任意一个类所具有的成员变量和方法; l 在运行时调用任意一个对象的方法; l 生成...

    java反射的原理机制

    讲解java反射原理,给那些迷惑于java反射的同胞给个分享!

    Java反射机制的详细讲解及实例,有助于java深度开发

    本文档对Java中使用最广的反射进行了深度而让人简单容易理解的解析,附有实例,可供致力于java底层研究的人提供借鉴

    Javafanshe.rar_java 反射_java反射_反射_反射机制

    Java反射机制剖析。里面有关于Java反射很详细的讲解。

    java反射机制知识点【精通JAVA必知必会】

    详细地讲解java反射机制 看完基础至少更进一层楼

    java 反射机制例子

    讲解了JAVA中反射机制,包含例子,代码!对初学者很有用

    实例讲解java的反射

    实例讲解java的反射 实例讲解java的反射

    java反射的讲解

    java中关于反射的ppt课程资源,ppt

    JAVA 反射详解PPT

    50页PPT详细讲解了反射与动态代理;强烈推荐。

    java反射之Constructor

    本文档时关于Java的反射的一个组件Constructor的描述和讲解

Global site tag (gtag.js) - Google Analytics