zoukankan      html  css  js  c++  java
  • Java反射学习总结一(基础篇)

    Class类是Reflection API中核心的类,他位于Java.lang.Class

    列出一些常用的方法。

    - getName() : 获得类的完整名字

    - getFields() : 获得类的public类型的属性

    - getDeclaredFields() : 获得类的所有属性

    - getMethods() : 获得类的public类型的方法

    - getDeclaredMethods() : 获得类的所有方法

    - getMethod(String name, Class[] parameterTypes) : 获取类的特定方法(name参数指定方法名字,parameterTypes参数指定方法参数类型)

    - getConstructors() : 获得类的public类型的构造方法

    - getConstructor(Class[] parameterTypes) : 获得类的特定构造方法(parameterTypes参数指定构造方法的参数类型)

    - newInstance() : 通过类的不带参数的构造方法创建这个类的一个对象


    如果想使用反射,有2个关键的部分

    1.获取Class对象

    2.获得对象实例

    下面来介绍这两个部分:


    1.如何获取Class对象

    获取某个类或某个对象所对应的Class对象的常用的3种方法

    a) 使用Class类的静态方法forName:       

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

    b) 使用类的.class语法: 

       String.class;

    c) 使用对象的getClass()方法(java.lang.Object类中的方法): 

       String s = "aa"; 

       Class<?> clazz = s.getClass();


    2.如何获得对象实例

    大家都知道获得对象实例就是去new一个,其实就是调用对象的构造方法

    这里将调用构造方法参数的不同分为两种类型:

    a)调用无参数的构造方法:

    1.调用Class对象的newInstance()方法:

    Class<?> classType = ClassClass.forName("java.lang.String");

    Object object = classTpye.newInstance();

             2.调用Class对象的Constructor对象的newInstance()方法,传递一个空的Class对象数组作为参数:

    Class<?> classType = ClassClass.forName("java.lang.String");

    Constructor cons = classType.getConstructor(new Class[]{});  

    Object object =cons.newInstance(new Object[]{});

    b)调用有参数的构造方法:

    1.调用Class对象的Constructor对象的newInstance()方法,传递一个可变长的Class对象数组作为参数,本例传递String,int两个参数:

    Class<?> classType = ClassClass.forName("java.lang.String");

    Constructor cons = classType.getConstructor(new Class[]{String.class, int.class});

      Object object = cons.newInstance(new Object[]{"hello",3});


    下面来一个小Demo,由于过于简单这里就只贴代码了

    这个demo简单的实现了上面介绍的一些关于反射的用法,算是一个复习巩固:

    1. class Person {  
    2.   
    3.     private long id;  
    4.     private int age;  
    5.     private String name;  
    6.       
    7.     public Person() {  
    8.           
    9.     }  
    10.       
    11.     public Person(String name, int age) {  
    12.         this.name = name;  
    13.         this.age = age;  
    14.     }  
    15.       
    16.     @Override  
    17.     public String toString() {  
    18.           
    19.         return "Name="+getName()+"  Age="+getAge()+"  Id="+getId();  
    20.     }  
    21.       
    22.     public long getId() {  
    23.         return id;  
    24.     }  
    25.   
    26.     public void setId(long id) {  
    27.         this.id = id;  
    28.     }  
    29.   
    30.     public int getAge() {  
    31.         return age;  
    32.     }  
    33.   
    34.     public void setAge(int age) {  
    35.         this.age = age;  
    36.     }  
    37.   
    38.     public String getName() {  
    39.         return name;  
    40.     }  
    41.   
    42.     public void setName(String name) {  
    43.         this.name = name;  
    44.     }  
    45.   
    46. }  
    很简单的一个自定义类,两个构造方法,和一些get,set方法,还有一个重写的toString


    下面是调用反射的main方法中的代码,主要就是用反射的方法调用Person的带参构造方法给age,name赋值,在调用setId给id赋值,最后调用toString方法打印出结果

    1. public static void main(String[] args) throws Exception {  
    2.           
    3.         //获取Person类的Class对象  
    4.         Class<?> classType = Class.forName("Person");  
    5.           
    6.         //调用Person类的两个参数构造方法生成对象  
    7.         Constructor constructor = classType.getConstructor(new Class[]{String.class, int.class});  
    8.         Object object = constructor.newInstance(new Object[]{"Dean",25});  
    9.           
    10.         //获取setId方法  
    11.         Method setId = classType.getMethod("setId", new Class[]{long.class});  
    12.           
    13.         //调用setId方法设置Id  
    14.         setId.invoke(object, new Object[]{10});  
    15.           
    16.         //调用toString输出结果  
    17.         Method toString = classType.getMethod("toString", new Class[]{});  
    18.         String result = (String) toString.invoke(object, new Object[]{});  
    19.         System.out.println(result);  
    20. }  

    输出结果为:Name=Dean  Age=25  Id=10


    最近正在看反射的视频和资料,写这个博文的目的就是对于学习的一个总结吧。

    陆续可能会更新一些我总结的更深层的反射知识,希望大家支持

     
  • 相关阅读:
    给力牛人
    设计模式
    微软真的要放弃Windows品牌吗?
    SQL2005 Express 自动安装之命令行
    SQL where之 in 在变量
    数据库求闭包,求最小函数依赖集,求候选码,判断模式分解是否为无损连接,3NF,BCNF
    别浪费了你的大内存[转]
    QQ空间免费养5级花和拥有人参果
    asp.net2 统一搜索引擎关键字编码[转]
    把网速提高4倍的方法和动画教程
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/6397395.html
Copyright © 2011-2022 走看看