Java反射获取类的属性值和方法

Java反射获取类的属性值和方法

结论:

1.获取私有属性与私有方法的时候,需要设置允许访问。
2.获取静态属性与静态方法的时候,不需要给类的实例。

Entity类代码:

public class Entity {
	private String fieldPrivate;
	
	private static String fieldStaticPrivate;
	
	public String fieldPublic;
	
	public static String fieldStaticPublic;

	private String operateWithFieldPrivate(){
		return "operate private method:"+ fieldPrivate;
	}
	
	private static String operateWithFieldStaticPrivate(){
		return "operate private static method:"+ fieldStaticPrivate;
	}
	
	public String operateWithFieldPublic(){
		return "operate public method"+fieldPublic;
	}
	
	public static String operateWithFieldStaticPublic(){
		return "operate public static method"+fieldStaticPublic;
	}
	
	public String hasParameterMethod(String param1,String param2){
		return "operate hasParameterMethod:"+param1+","+param2;
	}
	
	public String hasChangeableParameterMethod(Object... objects){
		StringBuilder result=new StringBuilder();
		for(Object obj:objects){
			result.append(obj.toString()).append(",");
		}
		return "operate hasParameterMethod:"+result;
	}
}

ReflectTest类代码:

import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class ReflectTest{
	
	public static void main(String[] args) {
		try{
			Class clazz=Entity.class;
			Object entity= clazz.newInstance();
			
			//获取变量
			Field fieldPrivate=clazz.getDeclaredField("fieldPrivate"),
					fieldStaticPrivate=clazz.getDeclaredField("fieldStaticPrivate"),
					fieldPublic=clazz.getDeclaredField("fieldPublic"),
					fieldStaticPublic=clazz.getDeclaredField("fieldStaticPublic");
			
			//获取方法
			Method operateWithFieldPrivate=clazz.getDeclaredMethod("operateWithFieldPrivate"),
					operateWithFieldStaticPrivate=clazz.getDeclaredMethod("operateWithFieldStaticPrivate"),
					operateWithFieldPublic=clazz.getDeclaredMethod("operateWithFieldPublic"),
					operateWithFieldStaticPublic=clazz.getDeclaredMethod("operateWithFieldStaticPublic"),
					hasParameterMethod=clazz.getDeclaredMethod("hasParameterMethod",new Class[]{String.class,String.class}),
					hasChangeableParameterMethod=clazz.getDeclaredMethod("hasChangeableParameterMethod",Object[].class);
			
			//私有属性
			fieldPrivate.setAccessible(true);
			fieldPrivate.set(entity, "fieldPrivate's value");
			System.out.println(fieldPrivate.get(entity));
			
			//静态私有属性
			fieldStaticPrivate.setAccessible(true);
			fieldStaticPrivate.set(null, "fieldStaticPrivate's value");
			System.out.println(fieldStaticPrivate.get(null));
			
			//公共属性
			fieldPublic.set(entity, "fieldPublic's value");
			System.out.println(fieldPublic.get(entity));
			
			//公共静态属性
			fieldStaticPublic.set(null, "fieldStaticPublic's value");
			System.out.println(fieldStaticPublic.get(null));
			
			//私有方法
			operateWithFieldPrivate.setAccessible(true);
			System.out.println(operateWithFieldPrivate.invoke(entity));
			
			//私有静态方法
			operateWithFieldStaticPrivate.setAccessible(true);
			System.out.println(operateWithFieldStaticPrivate.invoke(null));
			
			//公共方法
			System.out.println(operateWithFieldPublic.invoke(entity));
			
			//公共静态方法
			System.out.println(operateWithFieldStaticPublic.invoke(null));
			
			//带固定参数的方法
			System.out.println(hasParameterMethod.invoke(entity, new String[]{"param1","param2"}));
			
			//带可变长度参数的方法1---------等同于数组
			//使用new Object[]{"param1","param2","param3","param4"},原因是因为编译器会以为
			//有4个入参,但实际只有一个入参
			Object[] objects={"param1","param2","param3","param4"};
			System.out.println(hasChangeableParameterMethod.invoke(entity, new Object[]{objects}));
			
			//带可变长度参数的方法2----------等同于数组
			Object arrayObj = Array.newInstance(Object.class, 4);  
            Array.set(arrayObj, 0, "param1");  
            Array.set(arrayObj, 1, "param2");  
            Array.set(arrayObj, 2, "param3");  
            Array.set(arrayObj, 3, "param4");  
            System.out.println(hasChangeableParameterMethod.invoke(entity, arrayObj));
            
		}catch(Exception e){
			e.printStackTrace();
		}
	}

}

结果:

fieldPrivate's value
fieldStaticPrivate's value
fieldPublic's value
fieldStaticPublic's value
operate private method:fieldPrivate's value
operate private static method:fieldStaticPrivate's value
operate public methodfieldPublic's value
operate public static methodfieldStaticPublic's value
operate hasParameterMethod:param1,param2
operate hasParameterMethod:param1,param2,param3,param4,
operate hasParameterMethod:param1,param2,param3,param4,




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值