Java反射常用方法

常用方法

获取类的引用的方式

//1、通过类名的方式
Class clazz=Class.forName(类名);
//例如:
Class<?> user = Class.forName("User");
//2、通过Class属性
Class<? extends User> userClass = User.class;
//3、通过具体对象
User u=new User();
Class<?> uClazz=u.getClass();

通过类的引用来创建对象

Class clazz=Class.forName("User")
//必须类中提供了一个无参的构造方法才可以用该方法
User u=clazz.newInstance();

获取类名

Class clazz=Class.forName("User")
String name = clazz.getName();//结果:com.test.demo.User
//没有包名
String simpleName = clazz.getSimpleName();//结果:User

获取对象的属性信息

User u = cons.newInstance("张三", 20);
 Class u = Class.forName("User");  
 //获取所有的属性
 Field[] fields = u.getFields();//返回的是申明为public的属性,包括父类中定义
 Field[] fields = u.getDeclaredFields();  //返回的指定类定义的所有定义(含私有域)的属性,不包括父类的
 System.out.println(declaredFields[1]);//结果:private java.lang.String com.test.demo.User.name
string name = declaredFields[1].getName();//没有包名
结果:name
获取get方法名
String method = "get" + declaredFields[1].substring(0, 1).toUpperCase() + declaredFields[1].substring(1);
Method method = user.getClass().getMethod(method);//得到方法对象
Object invoke = method.invoke(user);//得到属性set的值
结果:张三               
//获取指定的属性
Field f = u.getField("属性名"); //返回的是申明为public的属性
Field f = u.getDeclaredField("属性名");  //返回的指定类定义的所有定义(含私有域)的属性
//如:
Field user =  u.getDeclaredField("name"); //结果:private java.lang.String com.test.demo.User.name

获取Field参数信息

Class u = Class.forName("User");  
Field user =  u.getDeclaredField("name"); 
//获取指定参数的访问权限
int mod = user.getModifiers();//获取访问权限,返回是整形 结果:2
String modifier = Modifier.toString(user.getModifiers());//结果: private
//获取字段的数据类型对应的Class对象
Class<?> type = user.getType();//结果:class java.lang.String
//获取字段的名称
String name = user.getName();//结果:name

获取类的方法信息

Class u = Class.forName("User");  
//获取类的所有方法
Method[] methods = u.getMethods();  //含父类
Method[] methods = u.getDeclaredMethods() //不含父类 
//获取指定的方法
//第一个参数为方法名,第二个参数为方法形参的类型,若没有形参,则不写,有则写 若get方法不写,set方法写
 Method getMethod(String name,Class<?>... parameterTypes)
public Method getDeclaredMethod(String name,Class<?>... parameterTypes)
//例如:
Method getUserCode = clazz.getMethod("getUserCode");//第二个参数不写,getUserCode方法没有参数
Method setUserCode = clazz.getDeclaredMethod("setUserCode", String.class);//第二个参数写setUserCode方法的参数类型
Method getUserCode = clazz.getDeclaredMethod("getUserCode");
//使用invoke动态的调用方法,第一个参数为要调用该方法的对象,第二个参数为传入的参数
//注意:如果访问的方法是私有的 需要在前面先调用setAccessible(true)获得访问的权限
Object invoke = setUserCode.invoke(userDTO, "123");//给userCode设置为123,调用setUserCode方法
System.out.println(userDTO.getUserCode());//结果:123

获取类的构造方法

Class u = Class.forName("User");  
//获得所有构造方法
Constructor<?>[] constructors = u.getDeclaredConstructors();
Constructor<?>[] constructors = clazz.getConstructors();
System.out.println(declaredConstructors[0]);//结果:private java.lang.String com.test.demo.User.User()
//获得指定的构造方法,参数是构造方法的参数类型
Constructor<? extends User> cons = u.getConstructor(String.class,int.class);
Constructor<? extends User> declaredCons = clazz.getDeclaredConstructor();
//通过构造方法实例化对象
User u = cons.newInstance("张三", 20);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值