美文网首页
Java反射机制

Java反射机制

作者: 宿命99 | 来源:发表于2017-08-28 22:08 被阅读12次

    反射的定义

    Java本身属于静态语言,但是有着一个非常突出的动态机制;反射,即在程序运行时加载、探知、使用编译期间完全未知的classes。从class对象中获取构造函数、成员变量、方法、类等元素的反射对象,并通过这些对象对目标类对象进行操作。

    反射所需的类

    Class类:所在位置 java.lang.Class<T> 不提供public构造方法,由JVM通过调用类加载器的defineClass方法自动构造

    Constructor类:所在位置 java.lang.reflect.Constructor<T> T-在其中声明构造方法的类

    Method类:类或接口上单独某个方法的信息,所反映的方法可能是某类方法或实例方法(包括抽象方法)

    Field类:提供有关类或接口的单个字段的信息,以及对它的动态访问权限。

    反射API

    使用反射API获取当前Java虚拟机中的类、接口、成员变量、方法等信息。
    类:
    java.lang.Class#public static Class<?> forName(String className) throws ClassNotFoundException
    构造器:
    java.lang.Class#public Constructor<T> getConstructor(Class<?> ... parmeterTypes) throws NosuchMethod Exception, SecurityException
    java.lang.Class#public Contructor<T> getDeclareConstructor(Class<?>... paramterTypes) throws NosuchException, SecurityException
    成员变量
    java.lang.Class#public Field getField(String name) throws NoshFieldException, SecurityException
    java.lang.Class#public Field getDeclaredField(String name) throws NoshFieldException, SecurityException

    简单举例

    //这是一个简单的模型对象
    public class User {
    
        private String name;
        private int 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;
        }
    
        @Override
        public String toString() {
            return "User{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
    }
    
    public class UserReflect {
        public static void main(String[] args) {
            //1. 正常情况 使用new关键字
            User user = new User();
            System.out.println(user);
        }
    }
    
        public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
            //使用反射。 Class.forName(全限定名);
            Class<?> clazz = Class.forName("User");
            User user = (User) clazz.newInstance();
            System.out.println(user);
        }
    

    反射威力强大,只要稍微理解一下,很容易掌握。网上的例子也实在是很多了,没有必要重复举这么多例子。

    相关文章

      网友评论

          本文标题:Java反射机制

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