美文网首页Java 杂谈
(转) JAVA反射原理解读

(转) JAVA反射原理解读

作者: CENDEAL | 来源:发表于2018-08-07 06:09 被阅读42次

    原文链接:https://www.cnblogs.com/dongguacai/p/6535417.html

    一、什么是JAVA的反射

    1、在运行状态中,对于任意一个类,都能够知道这个类的属性和方法。

    2、对于任意一个对象,都能够调用它的任何方法和属性。

    这种动态获取信息以及动态调用对象的方法的功能称为JAVA的反射。

    二、反射的作用

    在JAVA中,只有给定类的名字,就可以通过反射机制来获取类的所有信息,可以动态的创建对象和编译。

    三、反射的原理

    JAVA语言编译之后会生成一个.class文件,反射就是通过字节码文件找到某一个类、类中的方法以及属性等。

    反射的实现主要借助以下四个类:

    Class:类的对象

    Constructor:类的构造方法

    Field:类中的属性对象

    Method:类中的方法对象

    1、获取类对象:

    通过类名获取Class对象,Class<T> c = Class.forName("类的完全路径");

    通过Class对象获取具体的类对象:Object o = (Object) c.newInstance();

    2、获取类中的构造方法:

    image image

    3、获取类中的属性:

    image image

    4、获取类中的方法:

    image image

    四、代码演示

    package reflection;
    
    import java.io.Serializable;
    
    public class DemoTest implements Serializable
    {
        /**
         * 注释内容
         */
        private static final long serialVersionUID = 1L;
    
        public String name;
        public int age;
        
        public DemoTest()
        {
        }
    
        public DemoTest(String name, int age)
        {
            this.name = name;
            this.age = age;
        }
        
        public void sayHello(String param)
        {
            System.out.println("hello " + param);
        }
    
        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;
        }
    }
    

    测试类

    package reflection;
    
    import java.lang.reflect.Constructor;
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    
    public class Test
    {
        public static void main(String[] args) throws Exception
        {
            //获取类DemoTest的Class对象
            Class<?> c = Class.forName("reflection.DemoTest");
            //打印该Class对象对表示的类的名称
            System.out.println(c.getName());
            //获取该类的实例
            System.out.println(c.newInstance());
            
            System.out.println("-------------------------------------------");
            //获取该类实现的接口
            Class<?>[] interfaces = c.getInterfaces();
            System.out.println(interfaces[0].getName());
            
            System.out.println("-------------------------------------------");
            //获取有参构造函数
            Constructor<?> con = c.getConstructor(String.class,int.class);
            DemoTest dt = (DemoTest)con.newInstance("xiaoming",12);
            System.out.println(dt.getAge());
            
            System.out.println("-------------------------------------------");
            //获取类的成员变量
            Field f2 = c.getField("age");
            System.out.println(f2);
            //获取指定对象上该字段表示的值
            System.out.println(f2.get(dt));
            
            System.out.println("-------------------------------------------");
            //获取指定的方法
            Method m = c.getMethod("sayHello", String.class);
            //反射调用方法,非常重要
            m.invoke(dt, "hangzhou");
        }
    }
    

    测试结果:

    reflection.DemoTest
    reflection.DemoTest@15db9742
    -------------------------------------------
    java.io.Serializable
    -------------------------------------------
    -------------------------------------------
    public int reflection.DemoTest.age
    -------------------------------------------
    hello hangzhou
    

    相关文章

      网友评论

        本文标题:(转) JAVA反射原理解读

        本文链接:https://www.haomeiwen.com/subject/slonvftx.html