java反射学习个人随笔

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java反射学习个人随笔相关的知识,希望对你有一定的参考价值。

个人学习反射的过程记录在这里:

一:先学习了Class这个类的一些基本知识。

Class这个类是为了来描述其他类的。一个Class类的对象实际上就是一个类(个人理解)。

每个类都有一个对应的该类的一个对象。它是由系统创建的。此时不管我定义几个Class类的对象。

它都会指向同一个对象。

 1 // 创建Class对象实例的三种方式。
 2         // 1.类名.class
 3         Class clazz = Person.class;
 4         // 2.对象.getClass()
 5         Class clazz1 = new Person().getClass();
 6         // 3.Class.forName("全类名") 用的最多也最普遍。java开发中的诸多框架都用到了反射机制。
 7         Class clazz2 = Class.forName("com.company.reflection.Demo");
 8         System.out.println(clazz == clazz1 && clazz1 == clazz2);
 9         // 打印结果为true.说明该类的在jre中的对象确实只有一个,它是由系统创建的。
10     }

二:学习一下三种级别的类加载器。三个类加载器的继承关系也一目了然。

 

// 系统类加载器
ClassLoader classLoader = this.getClass().getClassLoader();    System.out.println(classLoader);//[email protected]
// 扩展类加载器
classLoader = classLoader.getParent();    System.out.println(classLoader);//[email protected]
// 引导类加载器(c++写的,无法获取)
System.out.println(classLoader.getParent());//null

三:然后学习了constructor类,该类包含了反射过程执行中获取构造器的信息。

Class clazz = Class.forName("com.company.reflection.Demo");
Constructor[] constructors = clazz.getConstructors();
for (Constructor constructor : constructors) {
       System.out.println(constructor);
      // public com.infosys.reflection.Person()
     // public com.infosys.reflection.Person(java.lang.String,int,double)
}

 

四:接着学习了Method类。

Class clazz = Class.forName("com.company.reflection.Demo");
        // 获取所有public的方法,包括父类的方法。
        Method[] methods = clazz.getMethods();
        for (Method method : methods) {
            System.out.println("^^" + method.getName());
            // ^^toString
            // ^^getName
            // ^^setName
            // ^^getAge
            // ^^getSalary
            // ^^setSalary
            // ^^setAge
            // ^^wait
            // ^^wait
            // ^^wait
            // ^^equals
            // ^^hashCode
            // ^^getClass
            // ^^notify
            // ^^notifyAll
        }

 

// 只获取当前类中声明的方法。并且私有方法也可以获取。
Method[] methods2 = clazz.getDeclaredMethods();
    for (int i = 0; i < methods2.length; i++) {
        System.out.println("__" + methods2[i].getName());
            // __toString
            // __getName
            // __setName
            // __getAge
            // __getSalary
            // __setSalary
            // __setAge
            // __privateMethod
            //__protectedMethod
            //__defaultMethod

五:学习Field类。

        Class clazz = Person.class;
        Field [] fields = clazz.getDeclaredFields();
        for(Field f : fields){
            System.out.println(f);
            //public java.lang.String com.infosys.reflection.Person.nickName
            //private java.lang.String com.infosys.reflection.Person.name
            //private int com.infosys.reflection.Person.age
            //private double com.infosys.reflection.Person.salary
        }
        Field [] fields2 = clazz.getFields();
        for(Field field : fields2){
            System.out.println(field);
            //public java.lang.String com.infosys.reflection.Person.nickName
        }

 

以上是关于java反射学习个人随笔的主要内容,如果未能解决你的问题,请参考以下文章

java 反射代码片段

(。??)ノ~个人java学习随笔记录

随笔12 java反射机制

Java--反射(框架设计的灵魂)案例

反射,动态代理随笔

反射,动态代理随笔