反射的包
java.lang.reflect
java.lang.Class
通过反射来了解类
- 类由属性,方法,构造函数等组成
- 给定一个类或者对象,通过反射机制可以动态的
- 了解类的属性,方法,构造函数
- 创建对象
- 调用方法
- 改写属性
- 应用场景
- 运行时,动态的情况下应对外面传入的类名,对象实例等
- 只知道类名字符串
- 通常应用到框架中
常用的反射操作
- 通过一个对象获得完整的包名和类名
System.out.println("1.获得包名和类名============");
Class c=dog.getClass();
System.out.println("Method 1:");
System.out.println("类名:"+c.getName());
System.out.println("包名:"+c.getPackage().getName());
- 获得Class对象 -3种方法:
System.out.println("Method 1:"); //通过一个实例来获得class
Class dog=new Dog().getClass();
System.out.println(dog.getName());
System.out.println("Method 2:"); //通过forname来获取路径下的class
Class c=Class.forName(cName);
System.out.println(c.getName());
System.out.println("Method 3:"); //通过已知的类获取class
Class b=Dog.class;
System.out.println(b.getName());
- 了解类的各种信息
- 获得本类声明的方法
getDeclaredMethods() - 获得所有public的方法
getMethods() - 获得父类信息
getSuperclass() - 获得接口信息
getInterfaces()
- 获得本类声明的方法
- 根据Class对象创建instance
//方法一
Object o=dogClazz.newInstance(); //调用类的空构造方法
System.out.println("创建的对象是:");
System.out.println(o);
//方法二
Constructor c=dogClazz.getConstructor(new Class[]{String.class,int.class});
Object o2=c.newInstance(new Object[]{"大黄",5});
- 操作成员变量
Field中的getGenericType()方法获得属性的类型
Class dogClazz=Dog.class; //获得Calss
Object o=dogClazz.newInstance(); //获得Clss的实例
Field a=dogClazz.getField("age"); //获得公共属性
a.set(o, 20); //设置属性(对象,值)
System.out.println(a.get(o)); //得到对象所对应属性的值
Field own=dogClazz.getDeclaredField("own"); //获得自定义属性
own.setAccessible(true); //设置该属性可访问修改
own.set(o, "我的");
System.out.println(own.get(o));
- 调用成员方法
Object o=dogClazz.newInstance();
System.out.println("创建的对象:"+o);
Method m=dogClazz.getMethod("bark", new Class[]{}); //和构造方法类似
m.invoke(o, new Object[]{});