反射机制
- 反射机制:在运行时,我们可以动态的获取类中的信息;在运行期间可以实例化对象、调用方法 属性等等
- 所有的反射机制都是由字节码对象发起的
反射机制直接操作字节码文件,获取字节码对象:
Class class1=CC.class;//警告信息:Class是泛型
Class class2=Class.forName("com.kang4.CC");
Class class3=new CC().getClass();
获取类中的信息
class DD{
public String hhh;
protected int xxx;
class CC extends DD{
private String name;
public Integer age;
protected int height;
public static double aa;
public CC(){
}
public CC(String name){
}
public void aa(){
}
private void bb(int x){
}
public static void kk(){
}
public class MyReflect {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, SecurityException, NoSuchMethodException{
获取类中定义的属性
Class class1=CC.class;
//获取类中定义的属性
//只能获取被public修饰的,还有从父类继承而来的public
Field[] fields=class1.getFields();
//获取本类(继承父类中的不可获取)中定义的所有的属性,不分静态非静态,都可获取。
Field[] fields=class1.getDeclaredFields();
for(Field field:fields){
System.out.println(field);
//获取指定的属性对象
//只能获取public的
Field ageF=class1.getField("age");
//可以获取非public修饰的
Field ageF=class1.getDeclaredField("name");
System.out.println(ageF)
获取所有构造方法的信息
//只能获取public的
Constructor[] constructors=class1.getConstructors();
for(Constructor constructor: constructors){
System.out.println(constructor);
//可以获取私有的
Constructor[] constructors=class1.getDeclaredConstructors()
//获取指定的 为public的 构造方法,获取的为无参的
Constructor constructor=class1.getConstructor();
//获取一个参数的,为String的,可以获取非public 的
//基本数据类型也可以获取字节码信息(int.class)
Constructor constructor2=class1.getDeclaredConstructor(String.class);
获取所有方法的信息
//获取的为public的
Method[] methods=class1.getMethods();
for (Method method : methods) {
System.out.println(method)
//获取所有自己的方法
Method[] methods=class1.getDeclaredMethod();
//获取指定一个的方法
Method[] method=class1.getMethod(name, parameterTypes);
//name:方法名
//parameterTypes:参数类型
class1.getMethod("aa");//获取无参的
Method[] method=class1.getMethod("bb" ,int.class);
使用
public static void main(String [] args)throws InstantiationException,IllegalAccessExcption{
Class class1=CC.class;
//使用无参的构造方法创建对象
Object obj=class1.newInstance();//新建对象
System.out.println(obj);
}
//使用构造方法对象创建当前实例
Constructor constructor=class1.getDeclaredConstructor(String.class);
//new CC("aa");
//非public访问需要授权
constrcutor.setAccessible(true);
Object cc=constructor.newInstance("aa")
//属性的调用
Field name= class1.getDeclaredField("name");
name.setAccessible(true);
name.set(obj,value);
//obj:成员变量 value:赋的值
//如果是静态变量,第一个参数设置为null
name.set(cc,"张三");//为cc对象的name属性赋值为张三
//获取cc对象的name属性的值
Systen.out.println(name.get(cc));
//方法的调用
Method aa = class1.getMethod("aa");
//调用了cc对象的aa方法
aa.invoke(cc);
//有参数
Method bb =class1.getDeclaredMethod("bb",int.class)
//如果是静态方法将第一个参数设置为null即可
bb.invoke(cc,10);