Java 动态特性一:反射(reflect)

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
下面是反射机制用到的基本的代码:

  • ReflectTest 测试反射机制的类
  • User 实体类
package com.test.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * 测试java反射
 * @author zhb
 *
 */
public class ReflectTest {

    private static void test() throws Exception {
        
        String path = "com.test.reflect.User";
        
        // 获取类信息的方式有三种,三种方式获取的类对象相同;clazz是以后操作的关键
        // 第一种方式
        Class clazz = Class.forName(path);
        // 第二种方式
        Class clazz1 = User.class;
        // 第三种方式
        User u = new User();
        Class clazz2 = u.getClass();
        
        System.out.println(clazz.hashCode());
        System.out.println(clazz1.hashCode());
        System.out.println(clazz2.hashCode());
        
        // 获取类名称包名+类名; 
        String className = clazz.getName(); // clazz.getSimpleName();    // 只有类名
        
        // 获取clazz构造方法
        // 利用无参的构造方法创建对象user, 比较常用
        User user = (User) clazz.newInstance(); 
        user.setName("张三");
        // 获取有参的构造方法
        Constructor constructor = clazz.getConstructor(new Class[]{int.class, String.class});
        // 根据获取的有参的构造方法创建一个对象
        User user2 = constructor.newInstance(1001, "李四");
        System.out.println(user.getName()+"---------"+user2.getName());
        
        
        // 对属性的操作
        // 这样只能获取public的属性
        Field[] fields = clazz.getFields(); 
        // 获取所有的属性  declared:公告的
        Field[] fields1 = clazz.getDeclaredFields();  
        // 根据属性的名字获取属性
        Field field = clazz.getDeclaredField("name");
        // 跳过检查,不然给私有变量赋值会报错,也会提高效率,建议使用
        field.setAccessible(true); 
        field.set(user, "王五");
        System.out.println(user.getName());
        
        
        // 对方法的操作
        // 获取所有的公共方法
        Method[] methods = clazz.getMethods();
        // 获取所有的方法
        Method[] methods1 = clazz.getDeclaredMethods();
        // 根据指定的名字获取方法, public类型的方法
        Method method = clazz.getMethod("hello", String.class);
        // 跳过验证 ,提高效率
        method.setAccessible(true);
        Object result = method.invoke(user, "调用方法");
        System.out.println(result);
    }


    public static void main(String[] args) throws Exception {
        test();
    }

}

package com.test.reflect;

public class User {
    
    private int id;
    private String name;
    
    // 无参的构造方法,容易被忘记
    public User(){
        
    }
    
    //有参的构造方法
    public User(int id, String name){
        this.id = id;
        this.name = name;
    }
    
    // 类中一个普通的方法
    public String hello(String name){
        System.out.println("hello:"+ name);
        return "方法调用成功";
    }
    
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

}

你可能感兴趣的:(Java 动态特性一:反射(reflect))