java基础与基础加强反射/注解

发布时间:2014-10-22 14:24:03编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"java基础与基础加强反射/注解",主要涉及到java基础与基础加强反射/注解方面的内容,对于java基础与基础加强反射/注解感兴趣的同学可以参考一下。

Reflection 是Java被视为动态(或准动态)语言的一个关键性质。 主要由以下类来实现Java反射机制,这些类都位于java.lang.reflect包中 – Class类:代表一个类。 – Field 类:代表类的成员变量(成员变量也称为类的属性)。 – Method类:代表类的方法。 – Constructor 类:代表类的构造方法。 – Array类:提供了动态创建数组,以及访问数组的元素的静态方法 为了理解我这里举例说明: 以反射来读取一个类中定义的私有化属性的get和set方法: package com.itheima.study.reflection; //定义一个Student类提供3个属性分别为name, age, grade //为其提供set和get方法 //要利用方式的方式来分别读取两种构造方法生成的类中的set和 get方法。 public class Student { private String name; private int age; private int grade; public Student(String name, int age, int grade) { super(); this.name = name; this.age = age; this.grade = grade; } public Student() { } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public int getGrade() { return grade; } public void setGrade(int grade) { this.grade = grade; } } package com.itheima.study.reflection; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; //用于测试的类,该类中提供一个方法该方法完成以反射的方式来读取传入类中的set和get方法 public class ReflectTester { public static void main(String[] args) throws Exception { printBeanValue("com.itheima.study.reflection.Student"); }     // 读取set和get方法的方法 public static void printBeanValue(String objectName) throws Exception  { //得到class字节码类 Class<?> clazz = Class.forName(objectName); //得到带参数的构造方法 Constructor constructor = clazz.getConstructor(String.class, int.class, int.class); //得到不带参数的构造方法的实例 Object object = clazz.newInstance(); Object object2 = constructor.newInstance("zhangsan", 15, 90); //得到所有属性数组 Field[] fields = clazz.getDeclaredFields(); //遍历不带参数的构造方法类的方法 for (Field field : fields) { //得到属性名 String fieldName = field.getName(); //得到该属性的set方法名 String setMethodName = "set" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1); //得到该属性的get方法名 String getMethodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1); //获得set和get方法 Method setMethod = clazz.getMethod(setMethodName, field.getType()); Method getMethod = clazz.getMethod(getMethodName, null); if(field.getType() == String.class) { //手动设值                                 //执行该方法 setMethod.invoke(object, "李四"); } else { //手动设值                                //执行该方法 setMethod.invoke(object, 20); } //执行get方法 System.out.println(getMethod.invoke(object, null)); } System.out.println("------------------------------------"); //遍历带参数的构造方法类的方法 for (Field field : fields) { //得到属性名 String fieldName = field.getName(); //得到该属性的set方法名 String setMethodName = "set" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1); //得到该属性的get方法名 String getMethodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1); //获得set和get方法 Method setMethod = clazz.getMethod(setMethodName, field.getType()); Method getMethod = clazz.getMethod(getMethodName, null); //执行get方法 System.out.println(getMethod.invoke(object2, null)); } } } 下面是一个集合注解和反射的列子。 自己实现一个类似于单元测试的小型框架,该框架接受一个类的全名然后运行该类中的不带参[email protected] package com.itheima.study.annotation; [email protected],但是我们只运行不带参数的方法 public class MyClass { public void Method1() { System.out.println("没有被标注的方法"); } @test public void Method2() { System.out.println("不带参数方法1"); } @test public void add(int a, int b) { System.out.println(a + b); } @test public void Method4(String msg) { System.out.println("带参数方法2 -->" + msg); } @test public void Method5() { System.out.println("不带参数方法2"); } } package com.itheima.study.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; //定义注解 //指定注释所示用的元素类型为方法声明 @Target(ElementType.METHOD) //在虚拟机运行时保留注释。利用反射读取判断。 @Retention(RetentionPolicy.RUNTIME) //定义test注解 public @interface test { } package com.itheima.study.annotation; import java.lang.reflect.Method; import java.lang.reflect.Type; //导入自己定义的注解 import.com.itheima.study.annotation.test; public class ApplicationRun { public static void main(String[] args) { try { //执行函数 new ApplicationRun().run("com.itheima.study.annotation.MyClass"); } catch (Exception e) { e.printStackTrace(); } } //完成运行一个类中被test注解所修饰的不带参数的方法 public void run(String className) throws Exception { //获得类的字节码Class对象 Class<?> classType = Class.forName(className); //得到该类的实例 Object obj = classType.newInstance(); //得到该类的所有方法 Method[] methods = classType.getDeclaredMethods(); for (Method method : methods) { //判断注解是否为test if(method.isAnnotationPresent(test.class)) { //得到注解为test的方法的参数类型的数组 Type[] types = method.getGenericParameterTypes(); if(types.length == 0) { //参数类型的数组长度为零,表名该方法没有参数。执行该方法。 method.invoke(obj, null); } } } } }


上一篇:详解java类的生命周期
下一篇:如何学习FPGA?FPGA学习必备的基础知识

相关文章

相关评论

本站评论功能暂时取消,后续此功能例行通知。

一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!

二、互相尊重,对自己的言论和行为负责。

好贷网好贷款