注解和反射

获得反射对象

package TestReflected;

public class Test02 {
    public static void main(String[] args) throws ClassNotFoundException {

        Person person = new Student();
        System.out.println("这个人是"+person.name);

        //方式一
        Class C1=person.getClass();
        System.out.println(C1.hashCode());

        //方式二
        Class C2 = Class.forName("TestReflected.Test02");
        System.out.println(C2.hashCode());

        //方式三:通过类名.class获得
        Class C3=Test02.class;
        System.out.println(C3.hashCode());

        //方式四
        Class C4 = Integer.TYPE;
        System.out.println(C4);

        //获得父类类型
        Class C6 = C1.getSuperclass();
        System.out.println(C6);
    }
    }
    class Person{
        String name;
        public Person() {
        }

        public Person(String name) {
            this.name = name;
        }

        @Override
        public String toString() {
            return "Person{" +
                    "name='" + name + '\'' +
                    '}';
        }
    }
    class Student extends Person{
        public Student() {
            this.name="学生";
        }
    }
    class Teacher extends Person{
        public Teacher() {
            this.name="老师";
        }
    }


所有类型的Class对象

package TestReflected;

import java.lang.annotation.Annotation;
import java.lang.annotation.ElementType;

public class Test03 {
    public static void main(String[] args) {
        Class C1=Object.class;  //类
        Class C2=Comparable.class;  //接口
        Class C3=String[].class;
        Class C4=int[][].class;
        Class C5= Annotation.class;
        Class C6= ElementType.class;  //枚举类型
        Class C7=Integer.class;  //基本数据类型
        Class C8 =void.class;  //void
        Class C9=Class.class;

        System.out.println(C1);
        System.out.println(C2);
        System.out.println(C3);
        System.out.println(C4);
        System.out.println(C5);
        System.out.println(C6);
        System.out.println(C7);
        System.out.println(C8);
        System.out.println(C9);

        //只要元素类型与维度一样,就是同一个Class
        int[] a =new int[10];
        int[]b=new int[100];
        System.out.println(a.hashCode());
        System.out.println(b.hashCode());
    }
}

类的初始化

package TestReflected;
//测试类什么时候初始化
public class Test04 {
    static {
        System.out.println("main类被加载");
    }
    public static void main(String[] args) throws ClassNotFoundException {
        //1,主动引用
       // Son son =new Son();
        // main类被加载
        //父类被加载
        //子类被加载

        //反射也会产生主动引用
     //   Class.forName("TestReflected.Son");
        // main类被加载
        //父类被加载
        //子类被加载

        //不会产生类的引用的方法
     //   System.out.println(Son.b);
        //main类被加载
        //父类被加载
        //2
        
        //数组不会加载类
        Son[] array=new Son[5];
    }
}

class Father{
    static int b=2;
    static {
        System.out.println("父类被加载");
    }
}
class Son extends Father{
    static {
        System.out.println("子类被加载");
        m=300;
    }
    static int m=100;
    static final int M=1;
}

类加载器

类加载的作用:将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区的运行时数据结构,然后再堆中生成一个代表这个类的java.lang.Class对象,作为方法区中类数据的访问入口;
类缓存:标准的JavaSE类加载器可以按照要求查找类,但一旦某个类被加载到类加载器中,它将维持加载(缓存)一段时间,不过jvm垃圾回收机制可以回收这些Class对象;

package TestReflected;

public class Test05 {
    public static void main(String[] args) throws Exception {

        //获取系统类的加载器
        ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
        System.out.println(systemClassLoader);

        //获取系统类加载器的父类加载器-->扩展类加载器
        ClassLoader parent=systemClassLoader.getParent();
        System.out.println(parent);

        //获取扩展类加载器的父类加载器-->根加载器
        ClassLoader parent1= parent.getParent();
        System.out.println(parent1);

        //测试当前类是哪个加载器加载的
        ClassLoader classLoader= Class.forName("TestReflected.Test05").getClassLoader();
        System.out.println(classLoader);

        //测试当前类是哪个类加载的
        ClassLoader classLoader2 =Class.forName("java.lang.Object").getClassLoader();
        System.out.println(classLoader2);

        //如何获取系统类加载器可以加载的路径
        System.out.println(System.getProperty("java.class.path"));
    }
}

获取运行时类的完整结构

package TestReflected;

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

//获得类的信息
public class Test06 {
    private int age=10;
    String name="yan";
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException {

        Class c1=Class.forName("TestReflected.Test06");  //包名.类名(这里获取的是类中的东西)


        //获得类的名字
        System.out.println(c1.getName());
        System.out.println(c1.getSimpleName());

        //获得类的属性
        Field[] fields = c1.getFields();  //只能找到public属性
//        for (Field field1 : field) {
//            System.out.println(field);
//        }

        fields=c1.getDeclaredFields();
        for (Field field1 : fields) {
            System.out.println(field1);
        }


        //获得指定属性的值
        Field name=c1.getDeclaredField("name");
        System.out.println(name);

        //获得类的方法
        Method[] methods = c1.getMethods();  //获得本类及其父类的全部Public方法
        for (Method method : methods) {
            System.out.println("正常的:"+method);
        }
        Method[] declaredMethods = c1.getDeclaredMethods(); //获得本类的所有方法
        for (Method declaredMethod : declaredMethods) {
            System.out.println(declaredMethod);
        }

        //获得指定的方法

        Method getName =c1.getMethod("getName",null);
        Method setName =c1.getMethod("setName",String.class);
        System.out.println(getName);
        System.out.println(setName);

        //获得指定的构造器
        Constructor[] constructors = c1.getConstructors();
        for (Constructor constructor : constructors) {
            System.out.println(constructor);
        }
        Constructor[] declaredConstructors = c1.getDeclaredConstructors();
        for (Constructor declaredConstructor : declaredConstructors) {
            System.out.println(declaredConstructor);
        }

        Constructor declaredConstructor = c1.getDeclaredConstructor(int.class,String.class);
        System.out.println(declaredConstructor);
    }

    public Test06(int age, String name) {
        this.age = age;
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}


版权声明:本文为yfq_29原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。