反射,一种计算机处理方式。是程序可以访问、检测和修改它本身状态或行为的一种能力。
package com.demo.reflectTest;
import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Arrays;
import com.mysql.jdbc.Driver;
public class Test {
public static void main(String[] args) {
try {
Driver driver = new Driver();
// 用法一:通过一个对象获得完整的包名和类名
System.out.println(driver.getClass());
// 用法二:实例化Class类的对象
Class<?> class1 = Class.forName("com.mysql.jdbc.Driver");
Class<?> class2 = new Driver().getClass();
Class<?> class3 = Driver.class;
System.out.println(class1.getName());
System.out.println(class2.getName());
System.out.println(class3.getName());
// 用法三:通过Class实例化其他无参构造类的对象
Class<?> user = Class.forName("com.demo.reflectTest.User");
User u = null;
u = (User) user.newInstance();
System.out.println(user.equals(u));
// 用法四:通过Class调用其他类中的构造函数 (也可以通过这种方式通过Class创建其他类的对象)
Constructor<?> cons[] = user.getConstructors();
System.out.println(cons[0].getModifiers() + " "
+ cons[0].toGenericString());
User u0 = (User) cons[0].newInstance("root", "123456", 20);
System.out.println(cons[1].getModifiers() + " "
+ cons[1].toGenericString());
User u1 = (User) cons[1].newInstance("admin", 23);
System.out.println(cons[2].getModifiers() + " "
+ cons[2].toGenericString());
User u2 = (User) cons[2].newInstance("temp");
// 用法五:返回一个类实现的接口
Class<?> ins[] = user.getInterfaces();
for (Class<?> c : ins) {
System.out.println(c.getName());
}
// 用法六:取得其他类中的父类
System.out.println(user.getSuperclass());
// 用法七:获得类的属性
Field[] field = user.getDeclaredFields();
for (Field f : field) {
System.out.print(Modifier.toString(f.getModifiers()) + " ");
System.out.print(f.getType() + " ");
System.out.print(f.getName() + " ");
System.out.println();
}
// 用法八:通过反射调用其他类中的方法(JDK动态代理)
Method method = user.getMethod("sayHello");
method.invoke(user.newInstance());
method = user.getMethod("sayWords", String.class);
method.invoke(user.newInstance(), "World");
// 用法九:调用其他类的set和get方法
u = (User) user.newInstance();
setter(u, "Password", "654321", String.class);
getter(u, "Password");
// 用法十:通过反射操作属性
u = (User) user.newInstance();
Field fd = user.getDeclaredField("username");
fd.setAccessible(true);
fd.set(u, "guest");
System.out.println(fd.get(u));
// 用法十一:通过反射取得并修改数组的信息
int[] a = { 5, 4, 3, 2, 1, 0 };
Class<?> array = a.getClass().getComponentType();
System.out.println(array.getName());
System.out.println(Array.getLength(a));
System.out.println(Array.get(a, 2));
Array.set(a, 0, 7);
System.out.println(Array.get(a, 0));
// 用法十二:通过反射修改数组大小
int b[] = { 1, 2, 3, 4 };
int newB[] = (int[]) arrayInc(b, 8);
System.out.println(Arrays.toString(newB));
} catch (Exception e) {
e.printStackTrace();
}
}
private static Object arrayInc(Object o, int length) {
// TODO 自动生成的方法存根
Class<?> arr = o.getClass().getComponentType();
Object newO = Array.newInstance(arr, length);
int oldLength = Array.getLength(o);
System.arraycopy(o, 0, newO, 0, oldLength);
return newO;
}
private static void getter(Object o, String att) {
// TODO 自动生成的方法存根
try {
Method method = o.getClass().getMethod("get" + att);
System.out.println(method.invoke(o));
} catch (Exception e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
private static void setter(Object o, String att, Object value, Class<?> type) {
// TODO 自动生成的方法存根
Method method;
try {
method = o.getClass().getMethod("set" + att, type);
method.invoke(o, value);
} catch (Exception e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}