【7】java 反射详解

获取Class对象的方式:

1. Class.forName("全类名");

  将字节码加载进内存,返回Class对象,多用于配置文件,将类名定义在配置文件中,读取文件,加载类

2. 类名.class ;

  通过类名的属性class获取,多用于参数的传递

3. 对象.getClass();

  getClass()方法在object类中定义者,多用于对象的获取字节码方式

package Study;

class User {
    public String toString() {
        return "User: 成功";
    }

    public void func() {
        System.out.println("User: func");
    }
}

public class reflect {
    public static void main(String[] args) throws IllegalAccessException, InstantiationException, ClassNotFoundException {
        System.out.println("方法一:");
        Class<User> method1 = User.class;
        User user1 = method1.newInstance();
        user1.func();
        System.out.println(user1.toString());

        System.out.println("方法二:");
        Class<?> method2 = Class.forName("Study.User");
        User user2 = (User) method2.newInstance();
        user2.func();
        System.out.println(user2.toString());

        System.out.println("方法三:");
        Class<?> method3 = new User().getClass();
        User user3 = (User) method3.newInstance();
        user3.func();
        System.out.println(user3.toString());
    }
}

获取有构造函函数的类对象  class.getConstructor()

package Study;

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

class A {
    String sex;
    public A(String sex) {
        this.sex = sex;
    }

    public void fun() {
        System.out.println("A. 性别:"+sex);
    }

    public void show() {
        System.out.println("A. ");
    }
}

class B extends A{
    int age;
    int grade;
    String name;

    public B(String name, String sex) {
        super(sex);
        this.name = name;
    }

    public B(Integer a, Integer b) {
        super("女");
        this.age = a;
        this.grade = b;
    }

    public B(int a, int b) {
        super("男");
        this.age = a * 20;
        this.grade = b * 20;
    }

    public void show() {
        System.out.printf("B. name:%s, age=%d, grade:%d 
", name, age, grade);
    }
}

class C {
    String sex;
    public C (String sex) {
        this.sex = sex;
    }

    public void fun() {
        System.out.println("C. 性别:"+sex);
    }
}
public class OYTT {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        /** 获取的构造函数一定要public
         *  一定要与构造函数的类型相同
         */
        Class<?> clsB = Class.forName("Study.B");
        Constructor<?> ctorInt = clsB.getConstructor(int.class, int.class);
        B bInt = (B) ctorInt.newInstance(12, 78);
        bInt.show();

        Constructor<?> ctorInteger = clsB.getConstructor(Integer.class, Integer.class);
        B bInteger = (B) ctorInteger.newInstance(12, 78);
        bInteger.show();

        Constructor<?> ctorStr = clsB.getConstructor(String.class, String.class);
        B bStr = (B) ctorStr.newInstance("LiMing", "青年");
        bStr.show();

        System.out.println("------------------------");
        A bStrFather = (B) ctorStr.newInstance("LiMing", "青年");
        bStrFather.fun();
        bStrFather.show();

        A bStrFather1 = (A) ctorStr.newInstance("LiMing", "青年");
        bStrFather.fun();
        bStrFather.show();

        System.out.println("----------A--------------");
        Class<?> clsA = Class.forName("Study.A");
        Constructor<?> ctorA1 = clsA.getConstructor(String.class);
        A a = (A) ctorA1.newInstance("alis");
        a.fun();

        C c = (C) ctorA1.newInstance("alis");
        c.fun(); // 这样报错, 只能返回对象自己或者接口,父类等
    }
}

获取有参数的构造函函数的类对象  class.getConstructor(xx.class).newInstance(xx, xx)

package Study;

import java.lang.reflect.InvocationTargetException;

public class TestLzw {
    public TestLzw(int x, Integer y) {
        System.out.println("构造器, x:"+x+" y:"+y);
    }

    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        var aa1 = TestLzw.class.getPackageName();
        System.out.println("获取类包名: "+aa1);

        String className = "Study.TestLzw";
        System.out.println(Class.forName(className));
        System.out.println(TestLzw.class);
        System.out.println(className.getClass());

        Class<?> aa2 = Class.forName(className);
        aa2.getConstructor(int.class, Integer.class).newInstance(3, 4);
    }
}

做一个优秀的程序媛
原文地址:https://www.cnblogs.com/oytt/p/14368840.html