美文网首页
Java 动态特性一:反射(reflect)

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

作者: 真海ice | 来源:发表于2018-03-01 18:00 被阅读0次

    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<User> 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)

          本文链接:https://www.haomeiwen.com/subject/dvknxftx.html