反射是java的一门动态机制。
Java反射机制,可以实现以下功能:
①在运行时判断任意一个对象所属的类;
②在运行时构造任意一个类的对象;
③在运行时判断任意一个类所具有的成员变量和方法;
④在运行时调用任意一个对象的方法;
⑤生成动态代理。
一、Class对象
Class对象是反射的源头,Class对象是类第一次加载完成后存在于内存中的独一份的内容,它有这个类的所有内容,创建对象时其实获取的是Class对象的一个镜像。
获取类的class对象,也有三种方式:
①对象.getClass()
②类.class
③Class.forName(”包名.类名”)//一般尽量采用该形式
public class Source {
public static void main(String[] args) {
//第一种方式:对象.class
Source s=new Source();
Class c1=s.getClass();
//第二种方式:类.class
Class c2=Source.class;
//第三种方式(推荐方式):Class.forName()
Class c3=null;
try {
c3=Class.forName("com.abc.Source");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
System.out.println(c1.getName());
System.out.println(c2.getName());
System.out.println(c3.getName());
}
}
二、常用方法
(一)构造器
Constructor<T> getConstructor(Class<?>... parameterTypes)
返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法。Constructor<?>[] getConstructors()
返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法。Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
返回一个 Constructor 对象,该对象反映此 Class 对象所表示的类或接口的指定构造方法。Constructor<?>[] getDeclaredConstructors()
返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法。
(二)创建对象
- 类的Class对象中:
newInstance()
默认调用空构造器,如果没有空构造会抛出异常 - 获取到指定的构造器,通过反射创建对象
Constructor类中:T newInstance(Object... initargs)
指明使用当前构造器创建它所在类的实例
public static void testConstructor(Class cls) {
//1.创建对象
Object obj=cls.newInstance();
//获取所有的公共的构造器
Constructor[] cons=cls.getConstructors();
System.out.println(Arrays.toString(cons));
//指明创建对象的时候使用该构造器初始化信息
Object user=cons[0].newInstance(1234);
System.out.println(user);
//获取某一个构造器,包括私有的
Constructor con=cls.getDeclaredConstructor(String.class,int.class);
con.setAccessible(true); //放开权限
Object user2=con.newInstance("张三",123);
con.setAccessible(false); //关闭权限
System.out.println(user2);
}
(三)修饰符
int getModifiers()
返回此类或接口以整数编码的 Java 语言修饰符。
Class clz=Class.forName("com.abc.User");
//获得修饰符
int n=clz.getModifiers();
//使用Modifier转换为相应的字符串
System.out.println(Modifier.toString(n));
(四) 属性
Field getField(String name)
返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。Field[] getFields()
返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。Field getDeclaredField(String name)
返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。Field[] getDeclaredFields()
返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。
Class clz=Class.forName("com.abc.User");
//获取属性
System.out.println("===============本类属性==========");
// 取得本类的全部属性
Field[] field = clz.getDeclaredFields();
for (int i = 0; i < field.length; i++) {
// 1、权限修饰符
int mo = field[i].getModifiers();
String vis = Modifier.toString(mo);
// 2、属性类型
Class<?> type = field[i].getType();
//3、名字
String name = field[i].getName();
System.out.println(vis + " " + type.getName() + " "+ name + ";");
}
System.out.println("=========公开的属性包括接口或者父类属性======");
field = clz.getFields();
for (int i = 0; i < field.length; i++) {
System.out.println(field [i]);
}
(五) 方法
Method getDeclaredMethod(String name, Class<?>... parameterTypes)
返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法。Method[] getDeclaredMethods()
返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。Method getMethod(String name, Class<?>... parameterTypes)
返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法。Method[] getMethods()
返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法。
public static void test() throws Exception {
Class clz = Class.forName("com.abc.User ");
//获取属性
System.out.println("===============本类方法===============");
// 取得全部公共方法
Method[] methods =clz.getMethods();
for(Method m:methods){
//1、权限
int mod=m.getModifiers();
System.out.print(Modifier.toString(mod)+" ");
//2、返回类型
Class<?> returnType=m.getReturnType();
System.out.print(returnType.getName()+" ");
//3、名字
String name =m.getName();
System.out.print(name +"(");
//4、参数
Class<?>[] para=m.getParameterTypes();
for(int i=0;i<para.length;i++){
Class<?> p =para[i];
System.out.print(p.getName() +" arg"+i);
if(i!=para.length-1){
System.out.print(",");
}
}
}
(六) 数组
static Object newInstance(Class<?> componentType, int length)
创建一个具有指定的组件类型和长度的新数组。static void set(Object array, int index, Object value)
设置指定数组中索引组件的值。static Object get(Object array, int index)
返回指定数组对象中索引组件的值。