该懂的反射小操作
相关系列
前言
这里就不说哪些没用的了,直接干货,带你秒懂动态操作
代码:
实体类
public class User {
public int userid;
private String userName;
private String password;
public int getUserid() {
return userid;
}
public void setUserid(int userid) {
this.userid = userid;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public User(int userid, String userName, String password) {
super();
this.userid = userid;
this.userName = userName;
this.password = password;
}
public User() {
super();
}
}
测试类
Test2
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Test2 {
public static void main(String[] args) throws Exception {
String pathString = "com.bjsxt.pojo.User";
// 获取类的名称
Class class1 = Class.forName(pathString);
System.out.println("类的全名称:"+class1.getName());
System.out.println("类的名称:"+class1.getSimpleName());
System.out.println("--------------------------------------------");
// 获取父类的Class对象
Class class2 = class1.getSuperclass();
System.out.println(class2.getName());
System.out.println(class2.getSimpleName());
System.out.println("--------------------------------------------");
// 获取类的属性
Field field = class1.getField("userid");//获取单个属性,只能获取公共的属性
System.out.println(field);
Field[] fields = class1.getFields();//获取所有公共属性;
System.out.println(fields.length);
Field[] fields2 = class1.getDeclaredFields();//获取所有的属性;
System.out.println(fields2.length);
for(Field field2 : fields2) {
System.out.println(field2);//调用了toString方法
}
System.out.println();
for(Field field2 : fields2) {//获取属性的每个部分的信息
System.out.println(field2.getModifiers()+"\t"+field2.getType()+"\t"+field2.getName());
}
System.out.println("---------------------------------------------------");
// 获取类的方法信息
Method[] methods = class1.getDeclaredMethods();
System.out.println(methods.length);
for(Method method : methods) {
System.out.println(method);
}
System.out.println();
for(Method method : methods) {//获取属性的每个部分的信息
System.out.println("方法的权限"+method.getModifiers());
System.out.println("返回值类型"+method.getReturnType());
System.out.println("方法的名称:"+method.getName());
// 获取方法的参数
Class[] methodParam = method.getParameterTypes();
for(Class mp : methodParam ) {
System.out.println("方法的参数类型:"+mp.getTypeName()+"\t");
}
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
}
// 用于私有的属性,并且有公有的取值赋值方法以及无参构造方法这样的类叫做JavaBean
// 获取类的构造器
Constructor[] constructors = class1.getConstructors();
for(Constructor constructor : constructors) {
System.out.println(constructor);
}
// 获取指定的构造方法
Constructor constructor = class1.getConstructor(null);
System.out.println(constructor);
Constructor constructor2 = class1.getConstructor(int.class,String.class,String.class);
System.out.println(constructor2);
}
}
Test3
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import com.bjsxt.pojo.User;
public class Test3 {
public static void main(String[] args) throws Exception {
// 获取Class对象
Class class1 = Class.forName("com.bjsxt.pojo.User");
// 得到无参构造方法的对象
Constructor constructor = class1.getConstructor(null);
// 通过无参构造方法的对象,创建user类的对象;
User user =(User) constructor.newInstance();
// 获取指定的属性,动态操作属性
Field field = class1.getDeclaredField("userid");
// 这个属性无需做安全检查,直接访问
field.setAccessible(true);
field.set(user,1001);
System.out.println("取出userId这个属性的值:"+field.get(user));
// 动态操作方法,获取指定的方法
Method method = class1.getDeclaredMethod("setUserName", String.class);
// 执行该方法
method.invoke(user, "张三");
Method method2 = class1.getDeclaredMethod("getUserName",null);
System.out.println(method2.invoke(user));
}
}
つづく
接下来会不断更新关于反射的小内容,最后将会以一个小项目多为结尾敬请期待;
感觉收看,如果帮到您,点个赞,关个注,评个论呗,葵花在这里感激不尽!!!