反射,可以在运行时期动态创建对象;获取对象的属性、方法
反射创建对象
String className = "com.wsk.b_reflect.Admin";
// 得到字节码
Class<?> clazz = Class.forName(className);
// 创建对象1:默认构造器
Admin admin1 = (Admin)clazz.newInstance();
// 创建对象2:通过带参构造器
Constructor<?> constructor = clazz.getDeclaredConstructor(String.class,int.class);
Admin admin2 = (Admin)constructor.newInstance("tom",2);
反射获取属性名及值
// 获取类的字节码
Class<?> clazz = Class.forName("com.wsk.b_reflect.Admin");
// 调用类的默认构造器创建对象
Admin admin = (Admin)clazz.newInstance();
// 获取所有的属性名
Field[] fs = clazz.getDeclaredFields();
for(Field f:fs){
// 设置强制访问
f.setAccessible(true);
// 名称
String name = f.getName();
// 值
Object object = f.get(admin);
System.out.println(name+object);
}
获取方法名及调用方法
// 获取类的字节码
Class<?> clazz = Class.forName("com.wsk.b_reflect.Admin");
// 调用类的默认构造器创建对象
Admin admin = (Admin)clazz.newInstance();
// 获取方法
Method m1 = clazz.getDeclaredMethod("setName", String.class);
m1.invoke(admin, "jeck");
Method m2 = clazz.getDeclaredMethod("getName");
Object invoke = m2.invoke(admin);
System.out.println("123"+invoke);
Method[] methods = clazz.getDeclaredMethods();
for(Method m:methods){
String name = m.getName();
System.out.println(name);
Class<?>[] parameterTypes = m.getParameterTypes();
for (int i = 0; i < parameterTypes.length; i++) {
System.out.println(" "+parameterTypes[i]);
}
}