标签:
(1)注解
元注解是指注解的注解。包括 @Retention @Target @Document @Inherited四种。
1.1、@Retention: 定义注解的保留策略
/*java反射用法*/运行结果如下:
public class TestReflect extends InstrumentationTestCase {
public void testMain() {
LogUtil.e("测试反射:[START]");
try {
main();
} catch (Exception e) {
LogUtil.e("出错啦:e=" + e.getMessage());
}
LogUtil.e("测试反射:[END]");
}
//★这里说的Field都是 类 身上的,不是实例上的
public static void main() throws Exception {
Point pt1 = new Point(3, 5);
//得到一个字段
Field fieldY = pt1.getClass().getField("y"); //y 是变量名
//fieldY的值是5么?? 大错特错
//fieldY和pt1根本没有什么关系,你看,是pt1.getClass(),是 字节码 啊
//不是pt1对象身上的变量,而是类上的,要用它取某个对象上对应的值
//要这样
LogUtil.e(fieldY.get(pt1).toString()); //这才是5
//现在要x了
/*
Field fieldX = pt1.getClass().getField("x"); //x 是变量名
LogUtil.e(fieldX.get(pt1));
*/
//运行 报错 私有的,找不到
//NoSuchFieldException
//说明getField 只可以得到 公有的
//怎么得到私有的呢??
/*
Field fieldX = pt1.getClass().getDeclaredField("x"); //这个管你公的私的,都拿来
//然后轮到这里错了
// java.lang.IllegalAccessException:
//Class com.ncs.ReflectTest can not access a member of class com.ncs.Point with modifiers "private"
LogUtil.e(fieldX.get(pt1));
*/
//三步曲 一是不让你知道我有钱 二是把钱晃一下,不给用 三是暴力抢了
//暴力反射
Field fieldX = pt1.getClass().getDeclaredField("x"); //这个管你公的私的,都拿来
fieldX.setAccessible(true);//上面的代码已经看见钱了,开始抢了
LogUtil.e(fieldX.get(pt1).toString());
//out 3 OK!!
}
public static class Point {
private int x;
public int y;
public String s1 = "ball";
public String s2 = "hubin";
public String s3 = "zhangxiaoxiang";
//做实验而已,字段不可能是 public 的
public Point(int x, int y) {
super();
this.x = x;
this.y = y;
}
}
}
/*java反射中Method类invoke方法的用法*/运行结果如下:
public class TestReflect extends InstrumentationTestCase {
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public int add(int param1, int param2) {
return param1 + param2;
}
public String echo(String mesg) {
return "echo" + mesg;
}
public void testMain() {
LogUtil.e("测试反射:[START]");
Class classType = TestReflect.class;
try {
Object invokertester = classType.newInstance(); //1
Method addMethod = classType.getMethod("add", new Class[]{ //2
int.class, int.class
});
Object result = addMethod.invoke(invokertester, new Object[]{ //3
new Integer(100), new Integer(200)
});
LogUtil.e(result.toString());
Method echo = classType.getMethod("echo", new Class[]{String.class});
Object obj = echo.invoke(invokertester,
new Object[]{new String("jy is very good!!!")});
LogUtil.e(obj.toString());
TestReflect test = new TestReflect(); //1
test.setName("小明"); //2
Method[] methods = test.getClass().getDeclaredMethods(); //3
//循环查找获取id方法,并执行查看是否有返回值
for (int i = 0; i < methods.length; i++) {
//如果此方法有get和Id关键字则执行
if (methods[i].getName().indexOf("get") != -1 && methods[i].getName().indexOf("Name") != -1) {
try {
// 获取此get方法返回值,判断是否有值,如果没有值说明即将执行的操作新增
if (methods[i].invoke(test, null) == null) { //4
LogUtil.e("此对象没有值!!!");
} else {
Object strName = methods[i].invoke(test, null);
LogUtil.e(strName.toString());
}
} catch (Exception e) {
System.out.print("");
}
}
}
} catch (Exception ex) {
LogUtil.e("出错啦:e=" + ex.getMessage());
}
LogUtil.e("测试反射:[END]");
}
}
标签:
原文地址:http://www.cnblogs.com/yutianran/p/5069625.html