首页 > 代码库 > Java 反射
Java 反射
Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。使用反射Java程序可以加载一个运行时才得知名称的class,获悉其完整构造。
反射机制主要提供了以下功能:
- 在运行时判断任意一个对象所属的类;
- 在运行时构造任意一个类的对象;
- 在运行时判断任意一个类所具有的成员变量和方法;
- 在运行时调用任意一个对象的方法;
- 生成动态代理。
优点:
(1)能够运行时动态获取类的实例,大大提高系统的灵活性和扩展性。
(2)与Java动态编译相结合,可以实现无比强大的功能
缺点:
(1)使用反射的性能较低
(2)使用反射相对来说不安全
(3)破坏了类的封装性,可以通过反射获取这个类的私有方法和属性
一、Class类
Java所有类都是Class类的实例
二、类的反射
1.通过类名获取 类名.class
2.通过对象获取 对象名.getClass()
3.通过全类名获取 Class.forName(全类名)
public class Test { public static void main(String[] args) throws ClassNotFoundException { Class class1 = User.class; Class class2 = new User().getClass(); Class class3 = Class.forName("com.sa.pojo.User"); System.out.println("className: " + class1.getName()); // 父类 Class parentClass = class1.getSuperclass(); System.out.println("parentClass: " + parentClass.getName()); // 接口 Class[] interfaces = class1.getInterfaces(); System.out.print("Interfaces: "); for(Class clazz : interfaces) System.out.print(clazz.getName() + " "); } }
运行结果
className: com.sa.pojo.User
parentClass: java.lang.Object
Interfaces: java.io.Serializable
三、方法的反射
public class Test { public static void main(String[] args) throws ClassNotFoundException { Class<?> clazz = User.class; Method[] methods = clazz.getDeclaredMethods(); for(Method method : methods) { // 函数限定符、返回值类型 System.out.print(Modifier.toString(method.getModifiers())
+ " " + method.getReturnType().getName() + " " + method.getName() + "("); // 函数参数列表 Class<?> types[] = method.getParameterTypes(); if(types.length == 0) System.out.println(")"); else for(int i = 0; i < types.length; i++) System.out.print(types[i].getTypeName() + (i + 1 == types.length ? ")\n" : ",")); } } }
运行结果
public java.lang.String toString()
public java.lang.String getName()
public void setName(java.lang.String)
public int getAge()
public void setAge(int)
通过反射调用类方法
public class Test { public static void main(String[] args) throws Exception { Class<?> clazz = User.class; Method method1 = clazz.getMethod("setName", String.class); Object obj = clazz.newInstance(); method1.invoke(obj, "rose"); Method method2 = clazz.getMethod("getName"); String name = (String) method2.invoke(obj); System.out.println(obj); } }
运行结果 User [age=0, name=rose]
四、属性的反射
public class Test { public static void main(String[] args) throws Exception { Class<?> clazz = User.class; // 打印类中的所有属性 Field[] fields = clazz.getDeclaredFields(); for(Field field : fields) { System.out.println(Modifier.toString(field.getModifiers()) + " " + field.getType().getName()); } // 通过反射操作类中的字段 Object obj = clazz.newInstance(); Field field1 = clazz.getDeclaredField("age"); field1.setAccessible(true); field1.set(obj, 100); System.out.println(obj); } }
运行结果
private int
private java.lang.String
User [age=100, name=null]
Java 反射