-
什么是反射
反射java语言中的一种机制,通过这种机制可以动态的实例化对象、读写属性、调用方法
.java -> .class
.class -> .java -
类类
描述所有狗的类 狗类:Dog 狗对象:旺财
描述所有猫的类 猫类:Cat 猫对象:肥波
描述所有类的类 类类:java.lang.Class 类对象:特定类 -
一切反射相关的代码都从获得类对象开始
3.1 Class.forName(完整类名)
Class c = Class.forName(“com.entity.Person”);
3.2 类名.class
Class c = Person.class;
3.3 对象.getClass()
Class c = p.getClass();
Class c = new Person().getClass();
注1:ClassNotFoundException(类名错|少jar包)
注2:同一类的、类对象只会创建一个
-
反射三大作用(java.lang.reflect.*)
4.1 实例化对象
c.newInstance(); //类对象实例化对象c.getName(); //获得类对象全路径名
c.getSimpleName(); //获得类对象的类名
c.getConstructor() //返回public构造方法
c.getDeclaredConstructor() //返回带指定参数类型的构造方法(不区分public/private)c.getParameterTypes() //构造方法参数类型
c.getPackage() //获得当前类所在包
c.getSuperclass() //获得父类的class
c.getInterfaces() //获得接口
4.2 动态调用方法
c.getMethods() //返回所有公开的方法
c.getDeclaredMethods() //返回所有方法
c.getDeclaredMethod(method-name, parameter) //返回指定方法
c.setAccessible(true) //对所有属性设置访问权限 当类中的成员变量为private时 必须设置此项
Method.invoke() //调用方法
案例1:
Class c = Test1.class;
try {
Method me = c.getDeclaredMethod("abc", String.class);
me.invoke();
} catch (Exception e) {
e.printStackTrace();
}
案例2:
Method m3 = c1.getDeclaredMethod("add", Integer.class,Integer.class);
m3.setAccessible(true);
Object v3 = m3.invoke(s, 10,20); //s是实例化的对象
System.out.println(v3);
4.3 读写属性
c.getDeclaredField() //返回所有属性(任意访问权限)
c.getDeclaredField(String) //返回指定私有属性
c.getField(String) //返回某个公开的属性
c.getFields() //返回所有公开的属性
c.setAccessible(true) //为private属性设置赋值权限
c.set(object, value) //为属性赋值
c.get(obj) //获得obj对象的某值
案例:
Class c1 = Class.forName("p1.Student");
Field filed = c1.getDeclaredField("sid"); //返回私有属性
filed.setAccessible(true); //为private属性设置赋值权限
filed.set(s, "s007"); //赋值
String sid =(String) filed.get(s);
System.out.println(sid);
-
访问修饰符
c.getModifiers() //获得类、属性、方法的修饰符
c.getTypeName()
方法或属性.getType() //获得属性或方法的类型5.1 Modifier类
Modifier.isStatic(int)
Modifier.isFinal(int)
Modifier.isPublic(int)
Modifier.isPrivate(int)
Modifier.isProtected(int)
Modifier.isAbstract(int)
Modifier.isInterface(int)
Modifier.isNative(int)5.2 修饰符对应值
默认友好的 0
PUBLIC 1
PRIVATE 2
PROTECTED 4STATIC 8
FINAL: 16SYNCHRONIZED: 32
VOLATILE: 64
TRANSIENT: 128
NATIVE: 256
INTERFACE: 512
ABSTRACT: 1024
STRICT: 2048