1. 获取class对象的三种方式
- Class.forName();
- 类名.class
- 实例对象.getClass();
2. 利用反射获取构造函数
-
Constructor<?>[] getConstructor() 返回所有公共构造方法对象数组
-
Constructor<?>[] getDeclaredConstructors() 返回所有构造方法对象数组(包括私有)
-
Constructor<?> getConstructor(...数据类型.class) 返回单个公共构造方法对象
-
Constructor<?> getDeclaredConstructor(...数据类型.class) 返回单个构造方法对象(包括私有)
(1) Constructor类中用于创建对象的方法
- T newInstance() 根据指定的构造方法创建对象
- setAccessible(boolean flag) 设置为true,表示取消访问(私有构造方法)检查
@Test
public void f2() throws Exception {
//通过类名.class加载字节码文件
Class<User> userClass = User.class;
//获取private修饰的构造方法
Constructor<User> contructor = userClass.getDeclaredConstructor(String.class, String.class);
//设置取消权限检查
contructor.setAccessible(true);
//使用该构造方法
User s = contructor.newInstance("张三","123");
System.out.println(s);
}
3. Class类中用于获取成员变量的方法
-
Field[] getField() 返回所有公共成员变量对象的数组
-
Field[] getDeclaredFields() 返回所有成员变量对象的数组(包括私有)
-
Field getField(String name) 返回单个公共成员变量对象
-
Fidld getDeclaredField(String name) 返回单个成员变量对象
(1)Field类中用于创建对象的方法
--void set(Object obj,Object value) 赋值
--Object get(Object obj) 获取值
@Test
public void f3() throws Exception{
Class<User> userClass = User.class;
//获取私有的属性
Field name = userClass.getDeclaredField("name");
name.setAccessible(true);
//获取属性名
String str = name.getName();
System.out.println(str);
//获取访问修饰符
int modifiers = name.getModifiers();
System.out.println(modifiers);
//获取对象的值
User user = new User(1,"张三","123456");
String o = (String)name.get(user);
System.out.println(o);
//设置对象的值
name.set(user,"李四");
System.out.println(user);
}
4.利用反射获取成员方法
-
Method[] getMethods() 返回所有公共成员方法对象的数组(包括继承的)
-
Method[] getDeclaredMethods() 返回所有成员方法对象的数组,不包括继承
-
Method getMethod(String name, ...paramterTypes) 返回单个公共成员方法对象
-
Method getDeclaredMethod(String name, ...paramterTypes) 返回单个成员方法对象
(1) Method类中用于创建对象的方法
--Object invoke(Object obj, Object...args) 运行方法
参数一:用obj对象调用该方法
参数二:调用方法的传递的参数(没有就不写)
返回值:方法的返回值(没有不写)
@Test
public void f4()throws Exception{
Class<User> userClass = User.class;
Method abc = userClass.getDeclaredMethod("abc",String.class);
abc.setAccessible(true);
String str = (String) abc.invoke(userClass,"李四");
System.out.println(str);
}
5.反射的作用
- 获取一个类里面所有的信息,获取到了之后,再执行其他的业务逻辑
- 结合配置文件,动态的创建对象并调用方法。
@Test
public void f5()throws Exception{
//对于任意一个对象,都可以把对象所有的字段名和值,保存到文件中去。
Class<User> userClass = User.class;
User u = new User(1,"张三","123456");
Field[] declaredFields = userClass.getDeclaredFields();
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("aaa.txt",true));
for (Field field:declaredFields) {
field.setAccessible(true);
String name = field.getName();
String value = field.get(u)+"";
String str = name+"="+value+"\n";
bos.write(str.getBytes());
}
bos.flush();
bos.close();
}
标签:反射,java,String,对象,User,class,userClass,name
From: https://www.cnblogs.com/-xyk/p/17185989.html