第十一天 反射、注解
2015-07-28 18:38
288 查看
Class类和java反射
package com.baidu.test1; import java.lang.annotation.Annotation; import java.lang.reflect.Field; import java.lang.reflect.Method; public class Test { public static void main(String[] args) { Student zhangsan=new Student(); System.out.println("张三本来的年龄是:"+zhangsan.getAge()); Class<? extends Student> clazz=zhangsan.getClass(); // Class<? extends Student> clazz=Student.class; try { Field field=clazz.getDeclaredField("age"); field.setAccessible(true); field.setInt(zhangsan, 21); System.out.println("修改后张三的年龄是:"+zhangsan.getAge()); field.setAccessible(false); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } Field[] fields=clazz.getDeclaredFields();//得到已声明字段 // Field[] fields=clazz.getFields();//得到公共访问字段 for(int i=0;i<fields.length;i++){ System.out.println("可访问字段:"+fields[i].getName()); } Method[] methods=clazz.getDeclaredMethods(); for(int i=0;i<methods.length;i++){ System.out.println("方法名:"+methods[i].getName()); Class[] cla=methods[i].getParameterTypes(); for(int j=0;j<cla.length;j++){ System.out.println("方法形参类型名:"+cla[j].getName()); } } } }
package com.baidu.test1; public class Student { private int age=20; private String name; public String sex; public int getAge() { return age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } }
Annotation(注解)
package com.baidu.test1; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface MyAnnotation { int age(); String name(); String sex(); }
package com.baidu.test1; import java.lang.reflect.AnnotatedType; import java.lang.reflect.Field; public class Clazz { @MyAnnotation(age=20,name="张三",sex="男") private Students zhangsan; @MyAnnotation(age=21,name="李四",sex="女") private Students lisi; private Students xiaoming; public Students getZhangsan() { return zhangsan; } public void setZhangsan(Students zhangsan) { this.zhangsan = zhangsan; } public Students getLisi() { return lisi; } public void setLisi(Students lisi) { this.lisi = lisi; } public Students getXiaoming() { return xiaoming; } public void setXiaoming(Students xiaoming) { this.xiaoming = xiaoming; } public Clazz(){ zhujie(); } public void zhujie(){ Class<? extends Clazz> cla=Clazz.class; Field[] fields=cla.getDeclaredFields(); for(int i=0;i<fields.length;i++){ Field field=fields[i]; System.out.println(field.getName()); MyAnnotation annotation=field.getAnnotation(MyAnnotation.class); if(annotation!=null){ field.setAccessible(true); Students students=new Students(); students.setName(annotation.name()); students.setSex(annotation.sex()); students.setAge(annotation.age()); try { field.set(this,students);//set(Object obj, Object value)将指定对象变量上此 Field 对象表示的字段设置为指定的新值 } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } field.setAccessible(false); } } } }
package com.baidu.test1; public class Students { private int age; private String name; private String sex; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } }
package com.baidu.test1; public class Test1 { public static void main(String[] args) { Clazz clazz=new Clazz(); System.out.println(clazz.getZhangsan().getAge());//20 System.out.println(clazz.getLisi().getName());//李四 } }
相关文章推荐
- leetcode 52: Maximum Subarray
- Android架构实战(四)—— Gson
- Failed to install *.apk on device 'emulator-5554': timeout
- python时间函数和常用格式化
- Integray Image(积分图)
- KVO
- OmniGraffle (一)从工具栏开始
- “net.tcp://localhost:9000/ObtainData”处带有协定“"IObtainData"”的 ChannelDispatcher 无法打开其 IchannelListener。
- Leetcode34 Search for a Range
- 噩梦 游戏结束 检测血量执行动画
- HDU 5316 Magician(线段树)
- OSGi控制台在Eclipse插件开发中的妙用
- 第三周第二天( 【Class类与Java反射 】 【Method类的常用方法 】 【注解】)
- sql语句
- 多态
- 黑马程序员——泛型
- DB2常用命令 -
- ARC
- 练习代码(八)对象的集合(一)
- HAL驱动的串口编程陷阱