java反射 学习记录

Posted 西北逍遥

tags:

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

java反射  学习记录

  1. 获取类的Class对象

Class<?> clazz = Class.forName("com.example.MyClass");

 

  1. 获取类的所有接口

 
Class<?>[] interfaces = clazz.getInterfaces();

 

  1. 获取类的所有抽象方法

 
Method[] abstractMethods = clazz.getDeclaredMethods();
  1. 获取类的所有成员变量和成员方法

 
Field[] fields = clazz.getDeclaredFields();

 

  1. 获取类的所有构造方法

 
Constructor<?>[] constructors = clazz.getDeclaredConstructors();

 

  1. 创建类的实例

 
Object instance = clazz.newInstance();

 

  1. 获取类的所有方法

 
Method[] methods = clazz.getDeclaredMethods();

 

  1. 调用方法

 
Method method = clazz.getDeclaredMethod("methodName", parameterTypes);  
Object result = method.invoke(instance, arguments);

 

  1. 设置属性值

 
Object value = clazz.getDeclaredField("fieldName").get(instance);

 

  1. 获取类的所有字段

 
Field[] fields = clazz.getDeclaredFields();

 

  1. 获取类的所有构造方法

 
Constructor<?>[] constructors = clazz.getDeclaredConstructors();

 

  1. 设置构造方法参数

 
Constructor<?>[] constructors = clazz.getDeclaredConstructors();  
Constructor<?> constructor = constructors[0];  
constructor.setAccessible(true);  
constructor.setAccessible(true);  
constructor.setAccessible(true);  
constructor.setAccessible(true);  
Object result = constructor.newInstance(arguments);

 

 

  1. 调用构造方法

 
constructor.setAccessible(true);  
constructor.setAccessible(true);  
constructor.setAccessible(true);  
constructor.setAccessible(true);  
Object result = constructor.newInstance(arguments);

 

  1. 创建对象数组

 
Object[] array = clazz.getConstructor(argumentTypes).newInstance(arguments);

 

  1. 调用方法

 
Method method = clazz.getDeclaredMethod("methodName", parameterTypes);  
Object result = method.invoke(instance, array);

 

 

Java反射(Java Reflection)是指在运行时动态地获取类的信息,包括类的字段、方法和构造方法,并对其进行操作的过程。反射允许开发者直接操作类的属性和方法,而不需要先创建类的实例。这可以简化代码,提高开发效率,并且使得代码更加灵活。

Java反射的意义在于:

  1. 简化开发:通过反射,开发者可以直接操作类的属性和方法,而不需要先创建类的实例。这可以简化代码,提高开发效率。
  2. 动态类加载:Java 中的许多类库和框架使用反射来支持动态加载。通过反射,可以在运行时动态地加载类,从而提高程序的灵活性和可扩展性。
  3. 增强代码安全性:反射可以在运行时获取类的信息,这使得攻击者可以获取到程序的内部状态,从而增强代码的安全性。因此,对于关键的程序,反射的使用应该谨慎,并且需要对输入数据进行严格的验证和过滤。
  4. 提高可维护性:反射允许开发者直接操作类的属性和方法,这使得代码更加灵活,但同时也增加了代码的复杂性。通过使用反射,可以更好地管理和维护代码,并且使得代码更加可读和可维护。

总之,Java反射是一种强大的工具,可以帮助开发者简化开发过程,提高代码的灵活性和可维护性,同时也增强了代码的安全性。

 

###########################

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反射学习个人随笔

JAVA的反射和工厂模式的例子实现

javaweb-codereview 学习记录-4

Java---注解与反射