反射:对象的反向处理操作;(没有反射,就没有Java的任何框架)
反射四大核心操作:Class、Constructor、Method、Field
1、Class:
- Class 类的三种实例化方式:
- 任意对象.getclass
- 类名.class
- 调用Class的静态方法,Class.forName(类的全名称)
- 利用Class对象反射创建类的对象
- Class取得对象;
- 根据Class对象创建新对象;(newInstance 默认调用无参构造)
Class<?> cls=Class.forName("java.util.Date");//取得对象
Object obj=cls.newInstance();//等价于 java.util.Data
- 取得父类信息:类的包名称、父类的Class对象、实现的父接口
Class<?> cls=myclass.class;
//取得包名称
System.out.println( cls.getPackage().getName());
//取得父类对象
System.out.println(cls.getSuperclass().getName());
//取得父接口
Class<?>[] icls=cls.getInterfaces();
for (Class<?> cls1 : icls) {
System.out.println(cls1);
}
2、Constructor
- getConstructor(参数)取得类中的构造方法;(public)—>public Constructor<T> getConstructor(参数);
//取得对象
Class<?> cls=myclass.class;
//取得Constructor对象
Constructor<?> constructor=cls.getConstructor(String.class);
//实例化对象
myclass mc=(myclass) constructor.newInstance("fay");
System.out.println(mc);
- getConstructors()取得类中所有的构造方法;(public)—>public Constructors<T> getConstructors();
//取得对象
Class<?> cls=myclass.class;
//取得所有构造方法
Constructor<?>[] constructor=cls.getConstructors();
//输出
for (Constructor<?> constructor2 : constructor) {
System.out.println(constructor2);
}
//调用
myclass mc1=(myclass) constructor[0].newInstance("fay");
myclass mc2=(myclass) constructor[1].newInstance("ff",18);
System.out.println(mc1);
System.out.println(mc2);
- getDeclaredConstructor()、getDeclaredConstructors() 取得类中所有的构造方法,与修饰符无关;
3、Method
- 取得所有普通方法;
getMethods[ ] :返回班类及父类所有的public方法;
getDeclaredMethods[ ]:返回本类所有普通方法,与修饰符无关;
- 取得指定方法 ;
getMethod(方法名,方法参数)
getDeclaredMethod(方法名,方法参数)
- 调用;
Method Object invoke(类的实例化对象,方法具体参数)
//取得对象
Class<?> cls=myclass.class;
Object obj=cls.newInstance();
//取得所有方法
Method[] methods=cls.getDeclaredMethods();
for (Method method : methods) {
System.out.println(method);
}
//取得指定的Method方法
Method setmethod=cls.getMethod("setAge", int.class);
setmethod.invoke(obj, 18);
Method getmeyhod=cls.getMethod("getAge");
Object result=getmeyhod.invoke(obj);
System.out.println(result);
4、 Field
- 取得所有类中属性:
getFields()
getDeclaredFields()
- 取得类中指定属性
getField(属性名)
getDeclaredField(属性名)
- 调用:
设置属性内容:public void set(具体实例化对象,属性值)
取得属性内容:public Object get(具体实例化对象)
//取得对象
Class<?> cls=myclass.class;
//实例化
myclass mc=(myclass) cls.newInstance();
//取得指定属性
Field field=cls.getDeclaredField("age");
//属性为private,需要破坏封装(默认flase)
field.setAccessible(true);
//field 提供的set(实例化对象,具体参数)
field.set(mc, 18);
//field 提供的get(实例化对象)
Object object=field.get(mc);
System.out.println(object);