java特性-----反射

时间:2019-10-26
本文章向大家介绍java特性-----反射,主要包括java特性-----反射使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

一.反射

1.反射的三种获取Class类的方法

  a.使用Class类的静态方法。

        

1  Class.forName("java.lang.String");

    实例如下:(输出结果见下文)

   

 1 try {
 2             Class <?> clazz=Class.forName("com.pl.model.Area");
 3             Method methods[] = clazz.getDeclaredMethods();
 4             for(int i=0;i<methods.length;i++){
 5                 System.out.println(methods[i]);//输入所有Area类中的方法
 6             }
 7             Field fields[] = clazz.getDeclaredFields();
 8             for(int i=0;i<fields.length;i++){
 9                 System.out.println(fields[i]);//输出所有Area类中的属性
10             }
11             Constructor constructors[] =clazz.getDeclaredConstructors();
12             for(int i=0;i<constructors.length;i++){
13                 System.out.println(constructors[i]);//输出所有Area类中的构造器
14             }
15         } catch (ClassNotFoundException e) {
16             e.printStackTrace();
17         }

  

   b.使用对象的getClass()方法。(一般放入方法中,传入一个对象)

1 Class<?> classType1 = str.getClass();

    实例如下:

 1   public static void test(Object obj){
 2         Class<?> clazz = obj.getClass();
 3         Method methods[] = clazz.getDeclaredMethods();
 4             for(int i=0;i<methods.length;i++){
 5                 System.out.println(methods[i]);
 6             }
 7             Field fields[] = clazz.getDeclaredFields();
 8             for(int i=0;i<fields.length;i++){
 9                 System.out.println(fields[i]);
10             }
11             Constructor constructors[] =clazz.getDeclaredConstructors();
12             for(int i=0;i<constructors.length;i++){
13                 System.out.println(constructors[i]);
14             }
15     }

   c.使用类的.class语法。

1 String.class;

    实例如下:

 public static void test(){
        Class<?> clazz = Area.class;
        Method methods[] = clazz.getDeclaredMethods();
        for(int i=0;i<methods.length;i++){
            System.out.println(methods[i]);
        }
        Field fields[] = clazz.getDeclaredFields();
        for(int i=0;i<fields.length;i++){
            System.out.println(fields[i]);
        }
        Constructor constructors[] =clazz.getDeclaredConstructors();
        for(int i=0;i<constructors.length;i++){
            System.out.println(constructors[i]);
        }
    }

    测试类Area代码如下:

 1 package com.pl.model;
 2 
 3 /**
 4  * @AutLhor: Mr.P
 5  * @Date: 2019/10/17
 6  * @Time: 22:51
 7  */
 8 public class Area {
 9     private Integer areaId;
10     private String  areaName;
11     private Integer pId;
12     private Integer level;
13 
14     public Integer getAreaId() {
15         return areaId;
16     }
17 
18     public void setAreaId(Integer areaId) {
19         this.areaId = areaId;
20     }
21 
22     public String getAreaName() {
23         return areaName;
24     }
25 
26     public void setAreaName(String areaName) {
27         this.areaName = areaName;
28     }
29 
30     public Integer getPId() {
31         return pId;
32     }
33 
34     public void setPId(Integer pId) {
35         this.pId = pId;
36     }
37 
38     public Integer getLevel() {
39         return level;
40     }
41 
42     public void setLevel(Integer level) {
43         this.level = level;
44     }
45 
46     public Area() {
47         super();
48     }
49 
50     public Area(Integer areaId, String areaName, Integer pId, Integer level) {
51         this.areaId = areaId;
52         this.areaName = areaName;
53         this.pId = pId;
54         this.level = level;
55     }
56 
57     @Override
58     public String toString() {
59         return "Area{" +
60                 "areaId=" + areaId +
61                 ", areaName='" + areaName + '\'' +
62                 ", pId=" + pId +
63                 ", level=" + level +
64                 '}';
65     }
66 }
67  

    log输出如下:

 1 com.pl.model.Area
 2 public java.lang.String com.pl.model.Area.toString()
 3 public java.lang.Integer com.pl.model.Area.getAreaId()
 4 public void com.pl.model.Area.setLevel(java.lang.Integer)
 5 public void com.pl.model.Area.setAreaId(java.lang.Integer)
 6 public void com.pl.model.Area.setPId(java.lang.Integer)
 7 public java.lang.Integer com.pl.model.Area.getPId()
 8 public java.lang.Integer com.pl.model.Area.getLevel()
 9 public java.lang.String com.pl.model.Area.getAreaName()
10 public void com.pl.model.Area.setAreaName(java.lang.String)
11 private java.lang.Integer com.pl.model.Area.areaId
12 private java.lang.String com.pl.model.Area.areaName
13 private java.lang.Integer com.pl.model.Area.pId
14 private java.lang.Integer com.pl.model.Area.level
15 public com.pl.model.Area()
16 public com.pl.model.Area(java.lang.Integer,java.lang.String,java.lang.Integer,java.lang.Integer)

  2.生成对象的两种方法  

    a.先获得Class对象,然后通过该Class对象的newInstance()方法直接生成即可:

    

1 Class<?> clazz = Radute.class;
2 Object demo =clazz.newInstance();

    b.先获得Class对象,然后通过该对象获得对应的Constructor对象,再通过该Constructor对象的newInstance()方法生成

1 Class clazz =Class.forName("com.pl.model.Area");
2 Constructor constructor = clazz.getDeclaredConstructor(new Class[]{});//如果new class[]{}是空的,可以使用null或者不写
3 Object instance =constructor.newInstance(new Object[]{});//反向创建了一个对象

   3.关于new Object[]{}与new Class[]{}的区别

  a.含义上的区别

    new Object[]{}表示的是创建一个对象数组,即里面存放的是Object对象组.

    new Class[]{}表示的是创建一个类对象数据,即里面存放的都是类对象.

    b.使用的地方

    什么时候为使用到Object类数组呢呢?很大可能就是会出现数组类的类型不同,所以这时候要用Object这个祖先数组类去包容,自当我们调用方法传参的时候,参数的类型很可能会出现不一致,所以就需要它了

             当我们利用有参构造器创建实体类时

    

1 Object instance =constructor.newInstance(new Object[]{1001,'北京',1234,12});

    当我们调用set等方法给实体类反向复制的时候

1  m.invoke(instance,new Object[]{1002});

     如果方法不需要传参数的话可以new Object[]{}或者null

      

    对于new Class[]{}来说,它表示的是类数组,意思就是类的种类,我们调用某个类的时候一般使用的是

1 Method method = clazz.getDeclaredMethod(methodName,new Class[]{});

      但是由于java重写这一特性,如果简单的通过方法名势必无法确定两个同名方法,这时候具需要具体的把参数也表示出来,也就是new Class[][}

1 Method method = clazz.getDeclaredMethod(methodName,new Class[]{int.class,int.class});

    

    说到这里,其实有关new Object[]{}和new Class[]{}的区别已经呼之欲出了,就是我们方法里的一个形参,一个实参而已,

new Class[]{}就是形参类型,new Object[]{}就是实参,只不过是形参的类型都是class而已,而实参的类型却不同,所以一个用

class,一个用object而已.

原文地址:https://www.cnblogs.com/pl12138/p/11744112.html