zoukankan      html  css  js  c++  java
  • Java-反射机制

    一、反射机制

    定义:

    在程序运行的过程中,能够动态加载类的信息

    反射机制时在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意的一个对象,都能够调用它的人一一个方法和属性;这种动态获取的信息以及动态调用对象的方法,称为Java的反射机制。

    反射的作用:

    • 在运行时判断一个对象所属的类

    • 在运行时构造一个类的对象

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

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

    反射的原理

    类的字节码文件,将xxx.java文件编译后,获得的xxx.class文件,该文件就是字节码文件,字节码文件加载到JVM中,就获得了字节码文件对象。

    如何获得字节码文件对象

    • Class.forName("类的全路径描述符")
    • 类.class
    • 对象.getClass()
    
    public class ReflectDemo {
    
        public static void main(String[] args) {
    
            Person person1 = new Person();
    
            Class classz1 = Person.class;
            Class classz2 = person1.getClass();
            try {
    
                Class classz3 = Class.forName("com.fonxian.base.reflect.Person");
                Object obj = classz3.getConstructor().newInstance();
                Person person2 = (Person) obj;
                person2.learn();
                
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
    
    
        }
    
    }
    
    
    

    反射机制API的使用

    1、实例化Class类对象

    
    Class<?> class1 = null;
    Class<?> class2 = null;
    Class<?> class3 = null;
    
    try {
        class1 = Class.forName("reflect.TestReflect");
        System.out.println(class1.getName());
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
    
    class2 = new TestReflect().getClass();
    System.out.println(class2.getName());
    
    class3 = TestReflect.class;
    System.out.println(class3.getName());
    

    2、获取对象父类或实现接口

    
    Class<?> parentClass = class1.getSuperclass();
    System.out.println(parentClass.getName());//若没有继承其他类,则返回的是Object类
    
    Class<?> intes[] = class1.getInterfaces();
    for(int i=0;i<intes.length;i++){
        System.out.println(intes[i].getName());
    }
    

    3、实例化类对象

    
    //方法一
    try {
        class1 = new TestReflect().getClass();
        TestReflect reflect = (TestReflect) class1.newInstance();
    } catch (InstantiationException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }
    //方法二
    Constructor<?> cons[] = class1.getConstructors();
    
    TestReflect tr1 = (TestReflect) cons[1].newInstance("name",20);
    

    4、获取类的属性

    
    Field[] field = class1.getDeclaredFields();
    for(int i = 0;i < field.length;i++){
        int mo = field[i].getModifiers();
        String access = Modifier.toString(mo);//mo为1,返回public,mo为2,返回private
    
        Class<?> type = field[i].getType();
        System.out.println(access+" "+type.getName()+" "+field[i].getName()+";");
      //private java.lang.String name;
    }
    
  • 相关阅读:
    JS 笔记
    html笔记 横向两列布局
    jsp HTTP Status 405
    有效范围为request的bean
    jsp:session对象存储数据
    sql笔记
    StringBuffer的用法
    VB学习笔记
    html 笔记
    Linux 笔记
  • 原文地址:https://www.cnblogs.com/fonxian/p/5788597.html
Copyright © 2011-2022 走看看