java Class 类与反射机制

2019-03-08  本文已影响0人  王古

java.lang.Class

Class 类的构造方法是私有的,只有 Java 虚拟机可以创建该类的对象,因此我们无法在代码中显式地声明一个 Class 对象。

  private Class(ClassLoader loader) {
        classLoader = loader;
    }

构造方法私有,类只能通过以下方法得到 Class 类对象

class AClass{}
AClass aClass1 = new AClass();

通过类的静态成员表示。每个类都有一个隐含的静态成员clas

Class c1 = AClass.class;

通过类对象的 getClass() 方法

Class c2 = AClass1.getClass();

通过 Class 类的静态方法 forName() 方法获取 Class 的对象。

mClass = Class.forName("custom.OtherClass");

Class 类的对象得到类的对象

newInstance() 调用 MyClass 类的无参构造方法。如果 MyClass 类中存在显示的有参构造方法,会覆盖默认的无参构造方法,同时又没有显示的声明无参构造方法,那么执行这段代码时会直接导致程序Crash掉。

AClass aClass2 = (AClass) c2.newInstance();

反射

反射就是加载类,并解剖出类的各个组成部分

反射机制的类

java.lang.Class;                
java.lang.reflect.Constructor;
java.lang.reflect.Field;        
java.lang.reflect.Method;
java.lang.reflect.Modifier;

Class类的实例化

package net.xsoftlab.baike;
public class TestReflect {
    public static void main(String[] args) throws Exception {
        Class<?> class1 = null;
        Class<?> class2 = null;
        Class<?> class3 = null;
        // 一般采用这种形式
        class1 = Class.forName("net.xsoftlab.baike.TestReflect");
        class2 = new TestReflect().getClass();
        class3 = TestReflect.class;
        
    }
}

获取对象的父类与接口

Class<?> clazz = Class.forName("net.xsoftlab.baike.TestReflect");
 // 取得父类
Class<?> parentClass = clazz.getSuperclass();

// 获取所有的接口,使用数组存储
Class<?> intes[] = clazz.getInterfaces();

获取全部构造函数

Constructor<?> cons[] = class1.getConstructors();

获取类的全部方法

Class<?> clazz = Class.forName("net.xsoftlab.baike.TestReflect");
Method method[] = clazz.getMethods();

https://m.w3cschool.cn/java/java-reflex.html

上一篇 下一篇

猜你喜欢

热点阅读