今天学习了类加载、类加载器、类反射机制,反射获取构造方法、反射获取成员变量,反射获取方法、反射越过泛型检查,反射通用方法,反射结合配置文件,静态代理设计模式。
作业
- 反射获取构造方法
public static void main(String[] args) throws Exception{
//获取User类对应的Class对象
Class<?> class1 = Class.forName("demo.User");
//获取无参构造方法对象
Constructor<?> c1 = class1.getConstructor();
//使用无参创建User类对象
Object obj1 = c1.newInstance();
System.out.println(obj1);
System.out.println("------------------------");
//获取User类对应的有参构造方法对象
Constructor<?> c2 = class1.getConstructor(Integer.class,String.class,String.class);
//使用有参创建User对象
Object obj2 = c2.newInstance(1,"tom","123456");
System.out.println(obj2);
System.out.println("------------------------");
Constructor<?> c3 = class1.getDeclaredConstructor(String.class,String.class);
//暴力反射,让私有构造器对象可以被外部访问
c3.setAccessible(true);
Object obj3 = c3.newInstance("mike","654321");
System.out.println(obj3);
- 反射获取成员变量
public static void main(String[] args) throws Exception{
//获取User类的Class对象
Class<User> userClass = User.class;
User user = userClass.newInstance();
//操作public修饰的成员变量
Field idField = userClass.getField("id");
//设置该成员变量值
//obj:需要设置的对象
//value:需要设置的值
//给user对象的id属性设置值为250
idField.set(user,250);
//获取该成员变量值
Object idValue = idField.get(user);
System.out.println(idValue);
//操作非public修饰的成员变量
Field usernameField = userClass.getDeclaredField("username");
usernameField.setAccessible(true);
usernameField.set(user,"tom");
Object namevalue = usernameField.get(user);
System.out.println(namevalue);
}
- 反射获取方法
public static void main(String[] args) throws Exception{
//获取User类的Class对象
Class<User> userClass = User.class;
//获取public修饰的成员方法
User user = userClass.newInstance();
//使用方法对象
//obj:哪个对象在执行该方法
//args:方法执行时所需的参数值
Method method1 = userClass.getMethod("setPassword", String.class);
method1.invoke(user,"123456");
System.out.println(user);
System.out.println("-------------------");
//操作非public修饰的成员方法
Method method2 = userClass.getDeclaredMethod("show");
method2.setAccessible(true);
method2.invoke(user);
}
- 反射越过泛型检查
public static void main(String[] args) throws Exception{
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
Class<? extends List> listClass = list.getClass();
Method add = listClass.getDeclaredMethod("add",Object.class);
add.setAccessible(true);
Object result = add.invoke(list,"hello world");
System.out.println(result);
System.out.println(list);
}
- 给指定对象的指定字段设置指定值
public static void main(String[] args) throws Exception{
User user = new User();
setValue(user,"id",10);
System.out.println(user);
}
/**
* 给指定对象的指定属性设置指定值
* @param obj 指定对象
* @param fielName 指定属性
* @param value 指定值
*/
public static void setValue(Object obj,String fielName,Object value)throws Exception{
Class<?> clazz = obj.getClass();
String methodName = "set" + fielName.substring(0,1).toUpperCase()+fielName.substring(1);
//System.out.println(methodName);
Field field = clazz.getDeclaredField(fielName);
Class<?> fieldType = field.getType();
Method method = clazz.getMethod(methodName,fieldType);
method.invoke(obj,value);
}