反射
反射提供的功能
反射入口
获取Class的三种方法
- Class.forName() (使用较多)
Class<?> clazz = null;
try {
clazz = Class.forName("com.dream.xiaobo.reflect.impl.MyInterfaceImpl");
System.out.println(clazz);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
- 类名.class
System.out.println(MyInterfaceImpl.class);
- 对象.getClass
MyInterfaceImpl myInterface = new MyInterfaceImpl();
Class<? extends MyInterfaceImpl> aClass = myInterface.getClass();
System.out.println(aClass);
获取方法
Class<?> clazz = null;
try {
clazz = Class.forName("com.dream.xiaobo.reflect.impl.MyInterfaceImpl");
//获取所有的公共方法(本类以及父类、接口中的所有方法 符合的访问修饰符规律的方法)
Method[] methods = clazz.getMethods();
for(Method method: methods){
System.out.println(method);
}
System.out.println("-------------");
//当前类的所有方法、不收访问修饰符的限制
Method[] declaredMethods = clazz.getDeclaredMethods();
for (Method declare:declaredMethods){
System.out.println(declare);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
获取接口
Class clazz = null;
try {
clazz = Class.forName("com.dream.xiaobo.reflect.impl.MyInterfaceImpl");
Class[] interfaces = clazz.getInterfaces();
for (Class inter: interfaces){
System.out.println(inter);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
获取父类
Class clazz = null;
try {
clazz = Class.forName("com.dream.xiaobo.reflect.impl.MyInterfaceImpl");
Class superclass = clazz.getSuperclass();
System.out.println(superclass);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
获取构造方法
Class clazz = null;
try {
clazz = Class.forName("com.dream.xiaobo.reflect.impl.MyInterfaceImpl");
Constructor[] constructors = clazz.getConstructors();
for(Constructor constructor: constructors){
System.out.println(constructor);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
获取属性
Class clazz = null;
try {
clazz = Class.forName("com.dream.xiaobo.reflect.impl.MyInterfaceImpl");
//获取共有的属性
Field[] fields = clazz.getFields();
for (Field field : fields){
System.out.println(field);
}
//获取本类的属性
Field[] declaredFields = clazz.getDeclaredFields();
for (Field fie : declaredFields){
System.out.println(fie);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
获取类的类的对象
Class clazz = null;
try {
clazz = Class.forName("com.dream.xiaobo.reflect.impl.MyInterfaceImpl");
//获取当前反射所代表类(接口)的实例对象
MyInterfaceImpl o = (MyInterfaceImpl)clazz.newInstance();
o.getInterface1();
o.getInterface2();
}catch (ClassNotFoundException e){
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
操作属性和方法
Class clazz = null;
try {
clazz = Class.forName("com.dream.xiaobo.reflect.impl.MyInterfaceImpl");
//获取到反射类的对象
MyInterfaceImpl instance = (MyInterfaceImpl) clazz.newInstance();
//获取到id属性
Field id = clazz.getDeclaredField("id");
//屏蔽private修饰符
id.setAccessible(true);
//给id赋值
id.set(instance,1);
System.out.println(instance.getId());
System.out.println("---------------");
//获取到student方法
Method method = clazz.getDeclaredMethod("student", String.class);
//屏蔽private修饰符
method.setAccessible(true);
//调用方法
method.invoke(instance,"xiaobo");
System.out.println("---------------");
//获取public修饰符的构造方法
Constructor constructor1 = clazz.getDeclaredConstructor(String.class);
//调用构造方法
MyInterfaceImpl xiaobo = (MyInterfaceImpl)constructor1.newInstance("xiaobo");
System.out.println("---------------");
//获取private修饰符的构造方法
Constructor constructor2 = clazz.getDeclaredConstructor(Integer.class);
//屏蔽private修饰符访问权限
constructor2.setAccessible(true);
//调用构造方法
MyInterfaceImpl wyb = (MyInterfaceImpl)constructor2.newInstance(1);
}catch (ClassNotFoundException e){
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
越过泛型检查
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
Class clazz = list.getClass();
try {
Method method = clazz.getMethod("add",Object.class);
method.invoke(list,"xiaobo");
System.out.println(list);
简单应用
public static void propertyUtils(Object type,String name,Object value){
Class<?> clazz = type.getClass();
try {
Field field = clazz.getDeclaredField(name);
field.setAccessible(true);
field.set(type,value);
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
MyInterfaceImpl myInterface = new MyInterfaceImpl();
PropertyUtils.propertyUtils(myInterface,"id",1);
PropertyUtils.propertyUtils(myInterface,"name","xiaobo");
System.out.println(myInterface.getId());
System.out.println(myInterface.getName());
Student student = new Student();
PropertyUtils.propertyUtils(student,"score",99.99);
System.out.println(student.getScore());
正确的开始、微小的长进、然后持续、嘿、我是小博、带你一起看我目之所及的世界…