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);
        }
    }

    做一个优秀的程序媛
  • 相关阅读:
    Good Bye 2014 B. New Year Permutation(floyd )
    hdu 5147 Sequence II (树状数组 求逆序数)
    POJ 1696 Space Ant (极角排序)
    POJ 2398 Toy Storage (叉积判断点和线段的关系)
    hdu 2897 邂逅明下 (简单巴什博弈)
    poj 1410 Intersection (判断线段与矩形相交 判线段相交)
    HDU 3400 Line belt (三分嵌套)
    Codeforces Round #279 (Div. 2) C. Hacking Cypher (大数取余)
    Codeforces Round #179 (Div. 2) B. Yaroslav and Two Strings (容斥原理)
    hdu 1576 A/B (求逆元)
  • 原文地址:https://www.cnblogs.com/oytt/p/14368840.html
Copyright © 2011-2022 走看看