java反射 学习记录
Posted 西北逍遥
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java反射 学习记录相关的知识,希望对你有一定的参考价值。
java反射 学习记录
-
获取类的Class对象
Class<?> clazz = Class.forName("com.example.MyClass");
-
获取类的所有接口
Class<?>[] interfaces = clazz.getInterfaces();
-
获取类的所有抽象方法
Method[] abstractMethods = clazz.getDeclaredMethods();
-
获取类的所有成员变量和成员方法
Field[] fields = clazz.getDeclaredFields();
-
获取类的所有构造方法
Constructor<?>[] constructors = clazz.getDeclaredConstructors();
-
创建类的实例
Object instance = clazz.newInstance();
-
获取类的所有方法
Method[] methods = clazz.getDeclaredMethods();
-
调用方法
Method method = clazz.getDeclaredMethod("methodName", parameterTypes);
Object result = method.invoke(instance, arguments);
-
设置属性值
Object value = clazz.getDeclaredField("fieldName").get(instance);
-
获取类的所有字段
Field[] fields = clazz.getDeclaredFields();
-
获取类的所有构造方法
Constructor<?>[] constructors = clazz.getDeclaredConstructors();
-
设置构造方法参数
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);
-
调用构造方法
constructor.setAccessible(true); constructor.setAccessible(true); constructor.setAccessible(true); constructor.setAccessible(true); Object result = constructor.newInstance(arguments);
-
创建对象数组
Object[] array = clazz.getConstructor(argumentTypes).newInstance(arguments);
-
调用方法
Method method = clazz.getDeclaredMethod("methodName", parameterTypes);
Object result = method.invoke(instance, array);
Java反射(Java Reflection)是指在运行时动态地获取类的信息,包括类的字段、方法和构造方法,并对其进行操作的过程。反射允许开发者直接操作类的属性和方法,而不需要先创建类的实例。这可以简化代码,提高开发效率,并且使得代码更加灵活。
Java反射的意义在于:
- 简化开发:通过反射,开发者可以直接操作类的属性和方法,而不需要先创建类的实例。这可以简化代码,提高开发效率。
- 动态类加载:Java 中的许多类库和框架使用反射来支持动态加载。通过反射,可以在运行时动态地加载类,从而提高程序的灵活性和可扩展性。
- 增强代码安全性:反射可以在运行时获取类的信息,这使得攻击者可以获取到程序的内部状态,从而增强代码的安全性。因此,对于关键的程序,反射的使用应该谨慎,并且需要对输入数据进行严格的验证和过滤。
- 提高可维护性:反射允许开发者直接操作类的属性和方法,这使得代码更加灵活,但同时也增加了代码的复杂性。通过使用反射,可以更好地管理和维护代码,并且使得代码更加可读和可维护。
总之,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反射 学习记录的主要内容,如果未能解决你的问题,请参考以下文章