java反射机制实战(3) - Method

反射获取对象的所有方法,并且打印方法名

public class ReflectionTest2 {
    public static void main(String[] args) throws Exception {
        ReflectionModel model = new ReflectionModel();
        Class<? extends ReflectionModel> clazz = model.getClass();

        // 获取本类以及父类public方法
        Method[] methods = clazz.getMethods();
        for (Method m : methods) {
            System.out.println(m.getName());
        }

        System.out.println("===============================");

        // 获取本类定义的所有方法
        Method[] declaredMethods = clazz.getDeclaredMethods();
        for (Method m : declaredMethods) {
            System.out.println(m.getName());
        }
    }
}
打印结果:
toString
getCount
getSql
wait
wait
wait
equals
hashCode
getClass
notify
notifyAll
===============================
toString
getCount
getSql
setSql
setCount

 打印Method的其他方法,可获取返回值、异常集合。generic的方法返回Type类型而不是Class

System.out.println(m.getName() + " -> returnType: " + m.getReturnType());
System.out.println(m.getName() + " ->> genericReturnType: " + m.getGenericReturnType().getTypeName());
// 获取方法异常,返回class
Class<?>[] exceptionTypes = m.getExceptionTypes();
for (Class<?> exceptionType : exceptionTypes) {
    System.out.println(m.getName() + " -> exceptionType: " + exceptionType.getName());
}
// 获取方法异常,返回Type类型数组
Type[] genericExceptionTypes = m.getGenericExceptionTypes();
for (Type type : genericExceptionTypes) {
    System.out.println(m.getName() + " ->> genericExceptionTypes: " + type.getTypeName());
}
打印结果:
toString
toString -> returnType: class java.lang.String
toString ->> genericReturnType: java.lang.String
getCount
getCount -> returnType: class java.lang.Integer
getCount ->> genericReturnType: java.lang.Integer
getCount -> exceptionType: java.lang.RuntimeException
getCount ->> genericExceptionTypes: java.lang.RuntimeException
getSql
getSql -> returnType: class java.lang.String
getSql ->> genericReturnType: java.lang.String
setSql
setSql -> returnType: void
setSql ->> genericReturnType: void
setCount
setCount -> returnType: void
setCount ->> genericReturnType: void

得到Method对象后,接下来就可以调用对象的方法

// 调用private setCount
Method setCountMethod = clazz.getDeclaredMethod("setCount", Integer.class);
setCountMethod.setAccessible(true);
setCountMethod.invoke(model, 10086);

// 调用public getCount
Method getCountMethod = clazz.getMethod("getCount");
Object invoke = getCountMethod.invoke(model);
System.out.println(invoke);

// 调用private static setCount2
Method setCount2Method = clazz.getDeclaredMethod("setCount2", Integer.class);
setCount2Method.setAccessible(true);
setCount2Method.invoke(model, 10000);
打印结果:
10086
10000

如果私有方法没有设置setAccessible(true) 则会报错

Exception in thread "main" java.lang.IllegalAccessException: Class com.pss.ReflectionTest2 can not access a member of class com.pss.model.ReflectionModel with modifiers "private static"
	at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:102)
	at java.lang.reflect.AccessibleObject.slowCheckMemberAccess(AccessibleObject.java:296)
	at java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:288)
	at java.lang.reflect.Method.invoke(Method.java:491)
	at com.pss.ReflectionTest2.main(ReflectionTest2.java:58)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值