zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    BZOJ1954 Pku3764 The xor-longest Path
    BZOJ3697 采药人的路径
    BZOJ1468 Tree
    BZOJ2326 [HNOI2011]数学作业
    BZOJ2809 [Apio2012]dispatching
    BZOJ1334 [Baltic2008]Elect
    BZOJ2882 工艺
    BZOJ3791 作业
    BZOJ1224 [HNOI2002]彩票
    [noip2013]花匠
  • 原文地址:https://www.cnblogs.com/juham/p/15705924.html
Copyright © 2011-2022 走看看