java反射浅析(二)关于Method 方法测试

上一篇博客中,大致了解了整个反射的机制。
这次主要是就反射的某些方法进行测试,以便更好的理解反射:
1.首相建立普通类:该类包括一些私有的方法和属性。

public class Tank {

private int x = 4;
public int y = 5;

public Tank(int x, int y) {
super();
this.x = x;
this.y = y;
}

public Tank(){

}
public int add(){

return 4;

}
private void bdd(){

System.out.println("私有方法步能访问哦 亲!!");

}
private void cdd(int x,int y){

System.out.println(" 亲!!");

}

}


该类有熟悉:x,y 方法:add,bdd,cdd(在类声明的,其中bdd,cdd 为私有方法)
2.建立测试类Test,访问Tank类的信息。

package ReflectJava;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Test {


public static void main(String[] args) throws InstantiationException, IllegalAccessException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException {

Class t = Tank.class; //得到Tank类的Class 对象
Object o = t.newInstance();// 通过class 对象实实例化一个Tanke对象

//-------------------Method 类的方法测试------------------------------

Method[] methods = t.getDeclaredMethods();
// getDeclaredMethods() 方法得到的是该类声明的方法,包括私有,公有方法

Method[] methoods = t.getMethods();
//getMethods() 方法得到 该类所有的公有方法
System.out.println("-------通过getDeclaredMethods()得到方法------------");
for(Method s: methods){

System.out.println(s.getName());

}
System.out.println("-------通过getMethods()得到方法------------");
for(Method ss: methoods){


System.out.println(ss.getName());

}
Method m1 = t.getDeclaredMethod("add");
Method m2 = t.getMethod("bdd");

// System.out.println(m2.invoke(o));
System.out.println(m2.invoke(o));

//---------------------------------------------------------------



}

}


测试结果:

-------通过getDeclaredMethods()得到方法------------
bdd
cdd
add
-------通过getMethods()得到方法------------
add
hashCode
getClass
wait
wait
wait
equals
toString
notify
notifyAll

通过测试类,明确
getMethods,getDeclareMethods,getMethod,getDeclareMethod 方法的区别:

// 返回方法数组
getMethods:返回该类的所有方法,但不包括私有方法
getDeclareMethods:返回该该类所有显示声明的方法,包括私有方法
// 返回特定方法
getMethod:返回该类的任何公有方法。
getDeclareMethod:返回该类的显示声明的公,私有方法。

总结: 只有getDeclareMethods,getDeclareMethod方法才能返回私有方法。
其他的只能返回公有方法。

也就是说对于返回明确的方法如:getMethod("方法名",Class[]{....}) 其方法名必须是公有的,否则程序运行时会报错。


关于方法参数设置问题:
public Method getMethod(String name,
Class<?>... parameterTypes)

如果要反射到public int add(int x,int y) 方法

则 对应参数设置为:
Method ss = getMethod("add",new [color=red]C[/color]lass[]{int.class,int.class});

例如 类 Tank t = new Tank();
调用该方法: ss.invoke(t,new Object[]{3,4});

注意:如果ss 为私有方法时,则调用ss.invoke方法时,运行时出现错误。
此时应该调用ss.setAccessible(true); 遏制jvm权限范围检查。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值