zoukankan      html  css  js  c++  java
  • 【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);
        }
    }

    做一个优秀的程序媛
  • 相关阅读:
    UVW源码漫谈(四)
    UVW源码漫谈(三)
    UVW源码漫谈(番外篇)—— Emitter
    UVW源码漫谈(一)
    UVW源码漫谈(二)
    如何利用GDI图像来制作验证码(在winform上面制作的当然也可以在web上面制作)
    利用C语言版本的数据库制作一个学生成绩管理系统
    行内元素与块级元素的区别
    filter的两种使用方法
    JavaScript随机数类型
  • 原文地址:https://www.cnblogs.com/oytt/p/14368840.html
Copyright © 2011-2022 走看看