反射:
运行时,操作类中的属性,方法,构造器…
一,得到类对象
1:通过对象反射类
Class c = 对象.getClass();
2:通过类名
Class c = 类名.class
3:通过类的全路径
Class c = Class.forName(“类路径”);
二:类对象作用
1:实例化类
c.newInstance();–调用默认构造方法(注意没有默认构造方法的时候,会抛出异常)
2:获取构造器(做对象的)
Constructor constructor = c.getConstructor(构造器的参数…);
Object obj = constructor.newInstance(实际参数) obj就是类的实例
3:获取属性:
Field f = c.getDeclaredField(“属性名”);
f.set(对象,值)–设置属性的值
f.get(对象)–获取属性的值
注意: 如果属性是private ,还想set和get话,需要调用f.setAccessible(true);
4:获取方法:
Method method = c.getDeclaredMethod(“方法名”,参数类对象…);
方法调用 method.invoke(对象,参数数)
5:批量操作
1)所有的属性
Field[] fs = c.getDeclaredFields();
for(Field f : fs) {
System.out.println(f.getName());
}
2)所有方法
Method[] ms = c.getDeclaredMethods();
for(Method m : ms ) {
System.out.println(m.getName());
}
3)所有构造器
Constructor[] cs = c.getConstructors();
for(Constructor cc: cs) {
System.out.println(cc.getParameters().length);
}
4)得到方法或者是构造方法的参数(Eclipse 需要设置下,才能获取到参数名字)
for(Method m : ms ) {
System.out.println(m.getName());
System.out.println(“参数:”);
Parameter[] ps = m.getParameters();
for(Parameter p : ps) {
System.out.println(p.getName());
System.out.println(p.getType());
}
}