频道栏目
首页 > 资讯 > Java > 正文

关于Java反射的使用详解

18-07-17        来源:[db:作者]  
收藏   我要投稿

什么是反射?

反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改他状态或行为的一种能力。JAVA反射机制是在运行状态中,对于任何一个类,都能知道这个类的所有属性和方法;对于任何一个对象,都能够调用他的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能成为Java语言的反射机制。简单的来说反射机制指的的是程序在运行是能够获取自身的信息。在java中,只要给定类的名字,那么就可以通过反射机制来获得类的所有信息。包括其访问修饰符、父类、实现的接口、属性和方法的所有信息,并可在运行时创建对象、修改属性(包括私有的)、调用方法(包括私有的)。

为什么用反射机制?

初次接触反射的概念,不经会想,直接创建对象不就可以了么,这里涉及到动态和静态的概念。静态编译:在编译时确定类型,绑定对象,即通过。

Student stu = new Student("zhangsan",30);

动态编译:运行时确定类型,绑定对象。动态编译最大限度发挥了java的灵活性,体现了多台的应用,用以降低类之间的耦合性。

Class.forName("com.Lct.Person.Student").newInstance();

一句话,反射机制的优点是可以实现动态创建对象和编译,体现出很大的灵活性,特别是在J2EE的开发中。他的缺点是对性能的影响。使用反射基本上是一种解释操作,这类操作总是慢于直接执行的相同操作,所以什么时候使用反射,就要靠业务的需求、大小,以及经验的积累来决定。

反射机制的关键

Java的反射机制的实现要借助于class类和java.lang.reflect包下4个类: Constructor, Field, Method,Array

Class类 - 代表类的Class对象

Constructor类-代表类的构造方法

Field类-代表类的属性

Method类-代表类的方法

Array类 - 提供动态创建数组,以及访问数组元素的静态方法

通过前四个对象我们可以粗略的看到一个类的各个组成部分

Array类会在最后有所简述。

Java 反射机制主要提供了以下功能

在运行时判断任意一个对象所属的类。

在运行时构造任意一个类的对象。

在运行时判断任意一个类所具有的成员变量和方法。

在运行时调用任意一个对象的方法

获取Class对象

获取Class对象的多种方式

代码示例(获取Class对象)

package com.Lct.classtype;
 
public class ClassDemo {
 
    public static void main(String[] args) {
 
        //使用实例对象.getClass()
        /*Employee employee = new Employee("zhangsan", 18);
        Class<?> class1 = employee.getClass();
        System.out.println(class1.getName());
        System.out.println(class1.getSuperclass().getName());*/
 
        //使用类名.Class
        /*Class<?> class1 = Employee.class;
        System.out.println(class1.getName());
        System.out.println(class1.getSuperclass().getName());*/
 
        //使用Class.forName("")
        /*try {
            Class<?> class1 = Class.forName("com.Lct.classtype.Employee");
            System.out.println(class1.getName());
            System.out.println(class1.getSuperclass().getName());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }*/
 
        //基本数据类型的Class对象
/*      Class <?> class1 = int.class;
        System.out.println(class1.getName());
        //基本数据类型没有父类,下面代码会报NullPointerException异常
        //System.out.println(class1.getSuperclass().getName());
*/       
 
        //包装类获取基本数据类型的Class对象
/*      Class <?> class1 = Integer.TYPE;
        System.out.println(class1.getName());
        //基本数据类型没有父类,下面代码同样会报NullPointerException异常
        //System.out.println(class1.getSuperclass().getName());
*/  
 
        //获取包装类的Class对象
        Class <?> class1 = Integer.class;
        System.out.println(class1.getName());
        System.out.println(class1.getSuperclass().getName());
    }
}
 
class Employee {
 
    private String name;
    private int age;
 
    public Employee(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public int getAge() {
        return age;
    }
 
    public void setAge(int age) {
        this.age = age;
    }
 
}

主类

import java.lang.reflect.Constructor;  
import java.lang.reflect.Field;  
import java.lang.reflect.Method;  
  
public class Test3 {  
  
  
    public static void main(String[] args) throws Exception{  
        //加载类  
        Class a = Class.forName("com.liu.Student");  
       // java API 中也提供了getFields()方法,和getDeclaredFields()方法的区别是getFields方法只是返回共有的属性  
        //而getDeclaredFields方法返回所有属性,相似的还有getDeclaredMethods()、getDeclaredConstructors();  
        Field[] declaredFields = a.getDeclaredFields();  
        for (Field field : declaredFields) {  
            System.out.println("属性:"+field);  
        }  
        //返回类的所有方法  
        Method[] declaredMethods = a.getDeclaredMethods();  
        for (Method method : declaredMethods) {  
            System.out.println("方法:"+method);  
        }  
        //返回类的所有构造方法  
        Constructor[] declaredConstructors = a.getDeclaredConstructors();  
        for (Constructor constructor : declaredConstructors) {  
            System.out.println(constructor);  
        }  
        //通过newInstance()方法可以获取一个Student对象,其中newInstance()方法是调用Student类的无参构造方法  
        Student stu = (Student) a.newInstance();  
        System.out.println(stu);  
           
        Student stu1 = (Student) a.newInstance();  
        //获取一个名叫name的属性  
        Field declaredField = a.getDeclaredField("name");  
        //关闭访问检查,开启访问检查对代码运行速度会有很大的影响,所以建议在使用时关闭访问检查  
        declaredField.setAccessible(true);  
        //为属性赋值  
        declaredField.set(stu1, "feifei");  
        System.out.println(stu1.getName());  
          
        Constructor declaredConstructor = a.getDeclaredConstructor(null);  
        //通过构造方法对象的newInstance()方法获取一个Student对象  
        //注意参数为null则表示这个构造方法为无参构造方法  
        Student stu2 = (Student) declaredConstructor.newInstance(null);  
        System.out.println(stu2);  
        //创建一个有参构造方法的对象,参数为构造方法中的类型的Class类型  
        Constructor con = a.getDeclaredConstructor(String.class,int.class,String.class,String.class);  
        //创建对象  
        Student stu3 = (Student) con.newInstance("liufei",29,"henansheng","123345456");  
        System.out.println(stu3.getAddress()+" "+stu3.getAge()+" "+stu3.getName()+" "+stu3.getPhone());  
          
        Student stu4 = (Student) a.newInstance();  
        //通过方法名可以获取一个方法的对象,第一个参数为方法名,第二个参数为参数类型的Class类型  
        Method declaredMethod = a.getDeclaredMethod("setName", String.class);  
        //激活  
        declaredMethod.invoke(stu4, "feige");  
        System.out.println(stu4.getName());  
          
    }  
      
      
}  

bean类

public class Student {  
  
    private String name;  
    private int age;  
    private String address;  
    private String phone;  
    public Student(){  
          
    }  
    public Student(String name, int age, String address, String phone) {  
        super();  
        this.name = name;  
        this.age = age;  
        this.address = address;  
        this.phone = phone;  
    }  
    public String getName() {  
        return name;  
    }  
    public void setName(String name) {  
        this.name = name;  
    }  
    public int getAge() {  
        return age;  
    }  
    public void setAge(int age) {  
        this.age = age;  
    }  
    public String getAddress() {  
        return address;  
    }  
    public void setAddress(String address) {  
        this.address = address;  
    }  
    public String getPhone() {  
        return phone;  
    }  
    public void setPhone(String phone) {  
        this.phone = phone;  
    }  
      
}  
相关TAG标签
上一篇:Linux驱动开发之混杂设备驱动代码实例
下一篇:介绍九种MySQL的强制性操作
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站