java 反射机制初探

本文导引:

  通过反射机制

 1 package reflection;
 2 
 3 @AnnotationUserTable("datebaseExample")
 4 public class User {
 5     @AnnotationUserField(uName="name",type="varchar",length=10)
 6     private String name;
 7     @AnnotationUserField(uName="age",type="int",length=3)
 8     private int age;
 9     @AnnotationUserField(uName="sex",type="char",length=2)
10     private String sex;
11     
12     public User() {
13         super();
14     }
15     
16     public User(String name, int age, String sex) {
17         super();
18         this.name = name;
19         this.age = age;
20         this.sex = sex;
21     }
22     
23     public String getName() {
24         return name;
25     }
26     public void setName() {
27         this.name = "test";
28     }
29     public int getAge() {
30         return age;
31     }
32     public String getSex() {
33         return sex;
34     }
35     public void setSex(String sex) {
36         this.sex = sex;
37     }
38 }
bean:User
 1 package reflection;
 2 
 3 import java.lang.annotation.ElementType;
 4 import java.lang.annotation.Retention;
 5 import java.lang.annotation.RetentionPolicy;
 6 import java.lang.annotation.Target;
 7 
 8 @Target(value={ElementType.TYPE})
 9 @Retention(RetentionPolicy.RUNTIME) 
10 public @interface AnnotationUserTable {
11     String value();
12 }
自定义注解:类注解
 1 package reflection;
 2 
 3 import java.lang.annotation.ElementType;
 4 import java.lang.annotation.Retention;
 5 import java.lang.annotation.RetentionPolicy;
 6 import java.lang.annotation.Target;
 7 
 8 @Target(value={ElementType.FIELD})
 9 @Retention(RetentionPolicy.RUNTIME)
10 public @interface AnnotationUserField {
11     String uName();
12     String type();
13     int length();    
14 }
自定义注解:属性注解
 1 package reflection;
 2 
 3 import java.lang.reflect.Constructor;
 4 import java.lang.reflect.Field;
 5 import java.lang.reflect.Method;
 6 
 7 public class Demo01 {
 8     static Class<?> c = null;
 9     public static void main(String[] args) {
10             try {
11                 c = Class.forName("reflection.User");
12             } catch (ClassNotFoundException e) {
13                 e.printStackTrace();
14             }
15         test();//获取类的属性、方法等信息
16         
17     }
18     static void test(){
19         try {
20             // 获取类的名称
21             System.out.println("获取类的名称");
22             System.out.println("getName():" + c.getName());// 获得包名+类名
23             System.out.println("getSimpleName():" + c.getSimpleName());// 获得类名
24             System.out.println("getCanonicalName():" + c.getCanonicalName());// 获得类名
25             System.out.println("*******************************");
26             // 获取属性信息
27             System.out.println("获取属性信息");
28             Field[] fields = c.getDeclaredFields();
29             // Field[] fields = c.getFields(); 只能获取public修饰的属性信息
30             for (Field f : fields) {
31                 String fName = f.getName();
32                 System.out.println(c.getDeclaredField(fName));
33             }
34             System.out.println("*******************************");
35             // 获取方法信息
36             System.out.println("获取方法信息");
37             Method[] methods = c.getDeclaredMethods();
38             for (Method m : methods) {
39                 // String mName = m.getName();
40                 System.out.println(m.getName() + "-->" + m);
41             }
42             System.out.println("通过名称单独获取对应的getName方法:" + c.getDeclaredMethod("getName"));
43             System.out.println("通过名称单独获取对应的setSex方法:" + c.getDeclaredMethod("setSex", String.class));// 方法有参,必须传递参数类型
44             System.out.println("*******************************");
45             // 获取构造器信息
46             System.out.println("获取构造器信息");
47             Constructor<?>[] constructor = c.getConstructors();
48             for (Constructor<?> cons : constructor) {
49                 System.out.println(cons);
50             }
51         } catch (NoSuchFieldException | SecurityException e) {
52             e.printStackTrace();
53         } catch (NoSuchMethodException e) {
54             e.printStackTrace();
55         }
56     }
57 }
main1:通过反射机制获取类的基本信息

output:

获取类的名称
getName():reflection.User
getSimpleName():User
getCanonicalName():reflection.User
*******************************
获取属性信息
private java.lang.String reflection.User.name
private int reflection.User.age
private java.lang.String reflection.User.sex
*******************************
获取方法信息
getName-->public java.lang.String reflection.User.getName()
setName-->public void reflection.User.setName()
setSex-->public void reflection.User.setSex(java.lang.String)
getSex-->public java.lang.String reflection.User.getSex()
getAge-->public int reflection.User.getAge()
通过名称单独获取对应的getName方法:public java.lang.String reflection.User.getName()
通过名称单独获取对应的setSex方法:public void reflection.User.setSex(java.lang.String)
*******************************
获取构造器信息
public reflection.User()
public reflection.User(java.lang.String,int,java.lang.String)
View Console

 

--> top

下面的例子,是通过反射机制获取类的注解信息。


 

 1 package reflection;
 2 
 3 import java.lang.reflect.Field;
 4 /**
 5  * 获取类的属性、方法等信息
 6  * 1.获取元素对象(如属性)(注意:读取类的注解,看似要少一步)
 7  * 2.获取该元素对象的指定类型的注解对象
 8  * 3.读取注解对象相应的值
 9  */
10 public class Test02 {
11     static Class<?> c = null;
12     public static void main(String[] args) {
13             try {
14                 c = Class.forName("reflection.User");
15             } catch (ClassNotFoundException e) {
16                 e.printStackTrace();
17             }
18         test();
19     }
20 
21     static void test(){
22         try {
23             // 获取类的指定注解
24             System.out.println("***********类的指定注解**************");
25             AnnotationUserTable table = (AnnotationUserTable)c.getAnnotation(AnnotationUserTable.class);
26             System.out.println(table.value());
27             
28             // 获取属性的指定注解
29             System.out.println("***********属性的指定注解*************");
30             Field field = c.getDeclaredField("name");
31             AnnotationUserField annoField = (AnnotationUserField)field.getAnnotation(AnnotationUserField.class);
32             System.out.println(annoField.uName()+"\t"+annoField.type()+"\t"+annoField.length());
33             
34             // 根据获得的表名、字段的信息,拼写出DDL语句,然后通过JDBC连接数据库查询
35         } catch (NoSuchFieldException e) {
36             e.printStackTrace();
37         } catch (SecurityException e) {
38             e.printStackTrace();
39         }
40     }
41 }

output:

***********类的指定注解**************
datebaseExample
***********属性的指定注解*************
name    varchar    10

 

--> top

下面的例子,是通过反射机制获取泛型信息


 

 1 package reflection;
 2 
 3 import java.lang.reflect.Method;
 4 import java.lang.reflect.Type;
 5 import java.util.List;
 6 import java.util.Map;
 7 
 8 /**
 9  * 通过反射机制获取泛型
10  * @author Administrator
11  *
12  */
13 public class Test03 {    
14     public static void main(String[] args) {
15         Class<?> c = Test03.class;
16         try {
17             System.out.println("*******获取参数值的类型**********");
18             Method m1 = c.getDeclaredMethod("method01", Map.class,List.class);
19             Type[] types = m1.getGenericParameterTypes();
20             for(Type t:types){
21                 System.out.println(t.getTypeName());
22                 System.out.println(t.toString());                
23             }
24             System.out.println("*******获取返回值的类型**********");
25             Method m2 = c.getDeclaredMethod("method02");
26             Type ret = m2.getGenericReturnType();
27             System.out.println(ret.getTypeName());
28             System.out.println(ret.toString());
29         } catch (NoSuchMethodException | SecurityException e) {
30             e.printStackTrace();
31         }
32     }
33     
34     public void method01(Map<String,String> args1,List<Integer> args2){
35         
36     }
37     public Map<String,String> method02(){
38         return null;
39     }
40 }
通过反射机制获取泛型信息

output:

java.util.Map<java.lang.String, java.lang.String>
java.util.Map<java.lang.String, java.lang.String>
java.util.Map<java.lang.String, java.lang.String>
java.util.Map<java.lang.String, java.lang.String>
java.util.List<java.lang.Integer>
java.util.List<java.lang.Integer>
View Console

 

--> top

转载于:https://www.cnblogs.com/fhw-space/p/6367325.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值