反射

1.反射调用构造器,方法,属性

package com.cj.java4;

import org.junit.Test;

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

public class ReflectionTest {
    @Test
    public void test1(){
        Person jack = new Person(12,"jack");
        jack.setAge(10);
        System.out.println(jack.toString());
        jack.show();
    }
    @Test
    public void test2() throws NoSuchMethodException, NoSuchFieldException, IllegalAccessException, InvocationTargetException, InstantiationException {
        //反射创建对象
        Class personClass = Person.class;
        Constructor cons = personClass.getConstructor(Integer.class,String.class);
        Object obj = cons.newInstance(12,"jack");
        Person p = (Person) obj;
        System.out.println(p.toString());

        //反射指定属性,方法
        Field age = personClass.getDeclaredField("age");
        age.set(p,12);

        //调用方法
        Method show = personClass.getDeclaredMethod("show");
        show.invoke(p);

        System.out.println("*********************");

        //调用私有的构造方法
        Constructor con1 = personClass.getDeclaredConstructor(String.class);
        con1.setAccessible(true);
        Object obj1 = con1.newInstance("jack");
        Person p1 = (Person) obj1;

        p1.show();
        //调用私有的属性

        Field name = personClass.getDeclaredField("name");
        name.setAccessible(true);
        name.set(p1,"jack1");
        p1.show();

        //调用私有方法

        Method showNation = personClass.getDeclaredMethod("showNation",String.class);
        showNation.setAccessible(true);

        String nation = (String)showNation.invoke(p, "中国人");
        System.out.println(nation);
    }

}

 2.获取类的加载器

@Test
public void test3() throws ClassNotFoundException {
    //1 通过.class
    Class clazz1 = Person.class;
    System.out.println(clazz1);
    //2 通过对象.getClass
    Person person = new Person();
    Class clazz2 = person.getClass();
    System.out.println(clazz2);
    //3 通过Class静态方法forName
    Class clazz3 = Class.forName("com.cj.java4.Person");
    System.out.println(clazz3);
    System.out.println(clazz1 == clazz2);
    System.out.println(clazz1 == clazz3);
    //4 通过classLoader
    ClassLoader classLoader = ReflectionTest.class.getClassLoader();
    Class clazz4 = classLoader.loadClass("com.cj.java4.Person");
    System.out.println(clazz1 == clazz4);
}

3.反射的动态性

//反射的动态性
    public void test5(){

        String classPath = "";
        for(int i = 0;i<100;i++){
            int num = new Random().nextInt(3);
            switch (num){
                case 0:
                    classPath = "java.util.Date";
                    break;
                case 1:
                    classPath = "java.lang.Object";
                    break;
                case 2:
                    classPath = "com.cj.java4.Person";
                    break;
            }
            try {
                Object instance = getInstance(classPath);
                System.out.println(instance);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }
    public Object getInstance(String classPath) throws Exception {
        Class<?> aClass = Class.forName(classPath);
        Object o = aClass.newInstance();
        return o;
    }

 4.获取类的注解

//注解
    public void test5() throws NoSuchFieldException {
        Class<Person> personClass = Person.class;
        Annotation annotation = personClass.getAnnotation(MyAnnotationType.class);
        System.out.println(annotation);
        Field age = personClass.getField("age");
        MyAnnotationField annotation1 = age.getAnnotation(MyAnnotationField.class);
        System.out.println(annotation1);

    }

person.java

package com.cj.java4;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotationType {
    String tableName();
}
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotationField {
    String fieldName();
}

@MyAnnotationType(tableName = "db_person")
public class Person {
    @MyAnnotationField(fieldName = "db_age")
    public Integer age;
    @MyAnnotationField(fieldName = "db_name")
    private String name;
    Person(){

    }
    private Person(String name){
        this.name = name;
    }
    private Person(Integer age){
        this.age = age;
    }
    public Person(Integer age, String name){
        this.age = age;
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

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

    public String getName() {
        return name;
    }

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


    public void show(){
        System.out.println(this.name + "-" +  this.age);
    }
    private String showNation(String nation){
        System.out.println("我是"+nation);
        return nation;
    }
}

 

posted @ 2022-04-22 21:31  写代码的小哥哥  阅读(30)  评论(0)    收藏  举报