Java反射机制:
是在运行状态中,对于任意一个类(class)文件,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性。这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。
反射机制中的类:
java.lang.Class;
java.lang.reflect.Constructor; java.lang.reflect.Field;
java.lang.reflect.Method;
java.lang.reflect.Modifier;
反射机制获取类:
//第一种方式:最灵活最具扩展性
Class demo = Class.forName("Demo");
//第二种方式:
//java中每个类型都有一个静态class属性来获取其对应的Class对象
Class demo = Demo.class;
//第三种方式:
//java语言中任何一个java对象都有getClass 方法
Demo d= new Demo();
Class demo = d.getClass();
创建对象: newInstance();
Class demo =Class.forName("Demo");
//调用了Demo的无参数构造方法,如果没有无参构造方法,可以使用getDeclaredMethod获取构造方法创建对象
//创建此Class 对象所表示的类的一个新实例
Object o = demo.newInstance();
获取属性:分为所有的属性和指定的属性
获取所有的属性的写法:
1 public void getFields() throws ClassNotFoundException 2 { 3 //获取整个类 4 Class c = Class.forName("java.lang.Long"); 5 //获取所有的属性,包括本类中的私有属性 6 Field[] fs = c.getDeclaredFields(); 7 StringBuffer sb = new StringBuffer(); 8 //获取类的修饰符和类名 9 sb.append(Modifier.toString(c.getModifiers()) + " class " + c.getSimpleName() + "{\n"); 10 for (Field field : fs) 11 { 12 sb.append("\t");//制表符 13 //获得属性的修饰符 14 sb.append(Modifier.toString(field.getModifiers()) + " "); 15 //属性的类型的名字 16 sb.append(field.getType().getSimpleName() + " "); 17 //属性的名字+回车 18 sb.append(field.getName() + ";\n"); 19 } 20 sb.append("}"); 21 System.out.println(sb); 22 }
获取特定的属性:
1 public void getField(String className, String fieldName, String value) throws Exception 2 { 3 //获取className类 4 Class c = Class.forName(className); 5 //获取fieldName属性 6 Field field = c.getDeclaredField(fieldName); 7 //实例化这个类赋 8 Object o = c.newInstance(); 9 //打破封装,使用反射机制可以打破封装性,导致了java对象的属性不安全。 10 field.setAccessible(true); 11 //给o对象的fieldName属性赋值set 12 field.set(o, value); 13 //get 14 System.out.println(field.get(o)); 15 }
方法关键字 含义
getMethods() 类或接口(包括超类和超接口继承的那些的类或接口)的公共方法
getMethod(String name, Class<?>... parameterTypes) 类或接口的指定公共成员方法
getDeclaredMethods() 获取所有方法,包括私有方法,但不包括继承的方法
getReturnType() 获得方法的放回类型
getParameterTypes() 获得方法的传入参数类型
getDeclaredMethod("方法名",参数类型.class,...) 获得特定的方法
构造方法关键字 含义
getConstructors() 获取类的所有公共构造方法
getConstructor(Class<?>... parameterTypes) 获取类的指定公共构造方法
getDeclaredConstructors() 获取所有的构造方法,包括私有构造方法
getDeclaredConstructor(参数类型.class,...) 获取特定的构造方法,包括私有构造方法
父类和父接口 含义
getSuperclass() 获取类的父类
getInterfaces() 获取类实现的接口
查看Java编译class文件字节码命令: #javap -c filepath.class --查看class文件字节码