java:反射与内省

 

 

 

 1 package com.vince;
 2 
 3 import org.junit.Test;
 4 
 5 public class ReflectionDemo {
 6 
 7 
 8     @Test
 9     public void test1(){
10         //通过对象的getclass()方法
11         Dog dog = new Dog("wangwang",4,"白色");
12         Class aClass = dog.getClass();
13 
14         //通过类.class
15         Class dogClass = Dog.class;
16 
17         //通过Class.forName方法
18         try {
19             Class aClass1 = Class.forName("com.vince.Dog");
20         } catch (ClassNotFoundException e) {
21             e.printStackTrace();
22         }
23 
24     }
25 
26 }
View Code

  1 package com.vince;
  2 
  3 import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;
  4 import org.junit.Test;
  5 
  6 import java.lang.reflect.*;
  7 
  8 /**
  9  * Created by vince on 2017/6/9.
 10  */
 11 public class ReflectionDemo {
 12 
 13 
 14     @Test
 15     public void test5(){
 16         Dog dog = new Dog("wangwang",4,"白色");
 17         Class<Dog> dogClass = Dog.class;
 18         //获取类的包名
 19         Package aPackage = dogClass.getPackage();
 20         //System.out.println(aPackage.getName());
 21         //获取公共的方法,包括继承的公有方法
 22         Method[] methods = dogClass.getMethods();
 23         for (int i = 0; i < methods.length; i++) {
 24             System.out.println(methods[i]);
 25             if (methods[i].getName().equals("toString")){
 26                 try {
 27                     String s = (String)methods[i].invoke(dog);
 28                     System.out.println(s);
 29                 } catch (IllegalAccessException e) {
 30                     e.printStackTrace();
 31                 } catch (InvocationTargetException e) {
 32                     e.printStackTrace();
 33                 }
 34             }
 35         }
 36         System.out.println("---------------");
 37         //访问私有方法,获取到本类中定义的所有方法(不包括父类)
 38         Method[] declaredMethods = dogClass.getDeclaredMethods();
 39         for (int i = 0; i < declaredMethods.length; i++) {
 40             System.out.println(declaredMethods[i]);
 41             if (declaredMethods[i].getName().equals("set")){
 42                 //设置 私有方法可以被访问(去除访问修饰符的检查)
 43                 declaredMethods[i].setAccessible(true);
 44                 try {
 45                     declaredMethods[i].invoke(dog);
 46                 } catch (IllegalAccessException e) {
 47                     e.printStackTrace();
 48                 } catch (InvocationTargetException e) {
 49                     e.printStackTrace();
 50                 }
 51             }
 52         }
 53     }
 54 
 55     //获取所有的属性
 56     @Test
 57     public void test4(){
 58 
 59         Class<Dog> dogClass = Dog.class;
 60         //获取非私有属性
 61         Field[] fields = dogClass.getFields();
 62         //System.out.println(fields.length);
 63 
 64         //获取所有属性(包括私有属性)
 65         Field[] declaredFields = dogClass.getDeclaredFields();
 66         //System.out.println(declaredFields.length);
 67         for (int i = 0; i < declaredFields.length; i++) {
 68             int modifiers = declaredFields[i].getModifiers();
 69             System.out.println(Modifier.toString(modifiers)+ " "+declaredFields[i].getType()+" "+declaredFields[i].getName());
 70         }
 71     }
 72 
 73     //获取所有构造方法
 74     @Test
 75     public void test3(){
 76         Class<Dog> dogClass = Dog.class;
 77         Constructor<?>[] constructors = dogClass.getConstructors();
 78         for (int i = 0; i < constructors.length; i++) {
 79             System.out.println(constructors[i].getName());
 80             System.out.println(constructors[i].getParameterCount());
 81 
 82         }
 83         try {
 84             //获取一个指定的构造方法
 85             Constructor<Dog> constructor = dogClass.getConstructor(String.class, int.class, String.class);
 86             //调用带参数的构造器来实例化对象
 87             Dog dog = constructor.newInstance("小白", 5, "白色");
 88         } catch (NoSuchMethodException e) {
 89             e.printStackTrace();
 90         } catch (IllegalAccessException e) {
 91             e.printStackTrace();
 92         } catch (InstantiationException e) {
 93             e.printStackTrace();
 94         } catch (InvocationTargetException e) {
 95             e.printStackTrace();
 96         }
 97     }
 98     /**
 99      * 通过反射来实例化对象
100      */
101     public void test2(){
102         Class<Dog> dogClass = Dog.class;
103         try {
104             //通过Class对象实例化类对象,调用了默认无参的构造方法
105             Dog dog = (Dog) dogClass.newInstance();
106         } catch (InstantiationException e) {
107             e.printStackTrace();
108         } catch (IllegalAccessException e) {
109             e.printStackTrace();
110         }
111     }
112 
113     /**
114      * 获取Class对象的三种形式
115      */
116     @Test
117     public void test1(){
118         //通过对象的getClass()方法
119         Dog dog = new Dog("wangwang",4,"白色");
120         Class aClass = dog.getClass();
121 
122         //通过类.class
123         Class dogClass = Dog.class;
124 
125         //通过Class.forName方法
126         try {
127             Class aClass1 = Class.forName("com.vince.Dog");
128         } catch (ClassNotFoundException e) {
129             e.printStackTrace();
130         }
131 
132     }
133 }
ReflectionDemo.java
 1 package com.vince;
 2 
 3 /**
 4  * Created by vince on 2017/6/12.
 5  */
 6 public class Dog {
 7     public int type;
 8     private String name;
 9     private int age;
10     private String color;
11 
12     private void set(){
13         System.out.println("set");
14     }
15 
16     protected void get(){
17         System.out.println("get");
18     }
19     public String getName() {
20         return name;
21     }
22 
23     public void setName(String name) {
24         this.name = name;
25     }
26 
27     public int getAge() {
28         return age;
29     }
30 
31     public void setAge(int age) {
32         this.age = age;
33     }
34 
35     public String getColor() {
36         return color;
37     }
38 
39     public void setColor(String color) {
40         this.color = color;
41     }
42 
43     @Override
44     public String toString() {
45         return "Dog{" +
46                 "name='" + name + '\'' +
47                 ", age=" + age +
48                 ", color='" + color + '\'' +
49                 '}';
50     }
51 
52     public Dog() {
53     }
54 
55     public Dog(String name, int age, String color) {
56         this.name = name;
57         this.age = age;
58         this.color = color;
59     }
60 }
Dog.java
原文地址:https://www.cnblogs.com/juham/p/15705924.html