取得类加载器和接口:
可以通过反射取得当前的类的加载器或者类的接口:
取得加载器:
package com.sxt;
public class Test {
public static void main(String[] args) throws Exception {
//取得反射对象
Class<?> empClass=Class.forName("com.sxt.Emp");
//使用反射取得Emp类的加载器
System.out.println(empClass.getClassLoader());
System.out.println(ClassLoader.getSystemClassLoader());
}
}
取得类的接口:
package com.sun;
public class Test {
public static void main(String[] args) throws Exception {
//取得反射对象
Class<?> empClass=Class.forName("com.sun.vo.Emp");
//使用反射取得Emp类的接口
System.out.println(empClass.getInterfaces()[1].getName());
}
}
取得类的全名称和简单名称:
package com.sun;
public class Test {
public static void main(String[] args) throws Exception {
//取得反射对象
Class<?> empClass=Class.forName("com.sun.vo.Emp");
//使用反射取得Emp类的名称
System.out.println(empClass.getName());
System.out.println(empClass.getSimpleName());
}
}
反射操作属性:
反射操作了构造方法,那么也可以使用反射操作属性,同样的要操作属性首先要取得属性,在Class类中提供了取得属性的相关方法,返回值类型的“java.lang.reflect.Field”
在Class类中取得属性的相关方法有:
public Field getDeclaredField(String name)
【返回所有属性,参数是属性的名称】
public Field getField(String name)
【返回public修饰的属性,参数是属性的名称】
public Field[] getDeclaredFields()
【取得所有属性,返回的是一个数组】
public Field[] getFields()
【取得所有public修饰的属性,返回的是一个数组】
以上的方法的返回值都与Filed类型有关,我们观察该类中的方法:
public Object get(Object obj)
【取得属性值,参数是该属性所在的对象】
public String getName()
【取得属性名称】
public Class<?> getType()
【取得属性类型的Class类对象】
public void set(Object obj, Object value)
【为属性赋值,第一个参数:属性所在的对象,第二个参数:赋值的内容】
public void setAccessible(boolean flag)
【取消私有封装】
操作属性:
package com.sun;
import com.sun.vo.Emp;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.util.Date;
public class Test {
public static void main(String[] args) throws Exception {
//取得反射对象
Class<?> empClass=Class.forName("com.sun.vo.Emp");
//创建一个Emp类对象
Constructor con=empClass.getConstructor(Integer.class,String.class,String.class,Double.class,Double.class,Integer.class,Integer.class, Date.class
);
Emp emp=(Emp)con.newInstance(1001,"张三","clerck",3000.00,1000.00,1002,10,new Date());
//取得属性对象
Field f=empClass.getDeclaredField("ename");
//取得属性的值(表示取得em对象的ename属性值)
System.out.println(f.get(emp));
}
}
取消私有属性的封装
package com.sun;
import com.sun.vo.Emp;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.util.Date;
public class Test {
public static void main(String[] args) throws Exception {
//取得反射对象
Class<?> empClass=Class.forName("com.sun.vo.Emp");
//创建一个Emp类对象
Constructor con=empClass.getConstructor(Integer.class,String.class,String.class,Double.class,Double.class,Integer.class,Integer.class, Date.class
);
Emp emp=(Emp)con.newInstance(1001,"张三","clerck",3000.00,1000.00,1002,10,new Date());
//取得属性对象
Field f=empClass.getDeclaredField("ename");
//为属性取消private权限
f.setAccessible(true);
//为属性重新复制
f.set(emp,"李四");
//取得属性的值(表示取得em对象的ename属性值)
System.out.println(f.get(emp));
}
}
取得所有属性:
package com.sun;
import com.sun.vo.Emp;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.util.Date;
public class Test {
public static void main(String[] args) throws Exception {
//取得反射对象
Class<?> empClass=Class.forName("com.sun.vo.Emp");
//创建一个Emp类对象
Constructor con=empClass.getConstructor(Integer.class,String.class,String.class,Double.class,Double.class,Integer.class,Integer.class, Date.class
);
Emp emp=(Emp)con.newInstance(1001,"张三","clerck",3000.00,1000.00,1002,10,new Date());
//取得所有的属性
Field [] fs=empClass.getDeclaredFields();
for(Field f:fs){
f.setAccessible(true);
System.out.println(f.getName()+"="+f.get(emp));
}
}
}
总结:
1、操作属性其实还可以使用操作setter方法和getter方法实现属性的操作。
2、Constructor(构造方法的类)、Method(表示普通方法的类)、Field(表示属性的类),这三个类有一个共同的父类(java.lang.reflect.AccessibleObject)。
3、反射还可以操作注解,注解是后面的内容,当我们讲完注解的时候再使用反射进行操作。