• 创建运行时类的对象,调用指定的属性方法构造器


    1 使用newInstance(),实际上是调用运行时空参的构造器

       注意构造器的权限修饰符要足够,同时必须有一个空参的构造器。

    2 调用指定的属性方法构造器

    package lianxi1;
    
    import java.lang.reflect.Constructor;
    import java.lang.reflect.Field;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    
    import org.junit.Test;
    
    
    
    public class TestReflection2 {
        @Test
        public void test1() throws ClassNotFoundException, SecurityException, NoSuchFieldException, InstantiationException, IllegalAccessException {
            //1.获取运行类的属性
            String str = "lianxi1.Person";
            Class clazz = Class.forName(str);
            Field f1 = clazz.getField("name");
            //如果属性是private的
            Field f2 = clazz.getDeclaredField("age");
            f2.setAccessible(true);
           //2.创建运行类的对象
            Object obj = clazz.newInstance();
            Person p = (Person)obj;
            System.out.println(p);
           //3.对属性赋值
            f1.set(p, "tian");
            f2.set(p, 25);
            System.out.println(p);
        }
        @Test
        public void test2() throws ClassNotFoundException, SecurityException, NoSuchMethodException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
            //2.调用运行时类中指定的方法
            Class clazz = Person.class;
            Method m1 = clazz.getMethod("show");
            Person p1 = (Person)clazz.newInstance();
            Object obj = m1.invoke(p1);   //如果是静态方法改为 m1.invoke(Person.class)
            System.out.println(obj);
            
            Method m2 = clazz.getDeclaredMethod("display",String.class,int.class);
            m2.setAccessible(true);
            Object obj2 = m2.invoke(p1,"yu",22);
            System.out.println(obj2);
        }
        @Test
        public void test3() throws SecurityException, NoSuchMethodException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException{
            //3.调用制定的构造器,创建运行时类的对象
            Class clazz = Person.class;
            Constructor con = clazz.getDeclaredConstructor(String.class,int.class);
            con.setAccessible(true);
            Person p2 = (Person)con.newInstance("wuming",21);
            System.out.println(p2);
            
        }
    }
  • 相关阅读:
    【NOIP2016练习】T3 subset (分块,状压DP)
    【CF173B】Chamber of Secrets(二分图,最短路)
    【CF721C】Journey(拓扑排序,最短路,DP)
    【BZOJ1040】骑士(基环树,树形DP)
    【CF725D】Contest Balloons(贪心,堆)
    【CF675E】Trains and Statistic(贪心,DP,线段树优化)
    【HDOJ2196】Computer(树的直径,树形DP)
    js继承
    原型模式
    创建对象
  • 原文地址:https://www.cnblogs.com/yjtm53/p/4166043.html
Copyright © 2020-2023  润新知