• java 通过反射调用属性,方法,构造器


    package reflection2;
    
    import static org.junit.Assert.assertArrayEquals;
    
    import java.lang.reflect.Constructor;
    import java.lang.reflect.Field;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    
    import org.junit.jupiter.api.Test;
    
    import reflection1.Person;
    
    /*
     * 调用运行时类中指定的结构:属性,方法,构造器
     * */
    
    public class ReflectionTest {
        
        /*
         * 
         * 
         * */
        @Test
        public void test1() throws NoSuchFieldException, SecurityException, InstantiationException, IllegalAccessException {
            Class clazz = Person.class;
            
            //创建运行时类对象
            Person person = (Person)clazz.newInstance();
            
            //获取指定变量名的属性
            Field name = clazz.getDeclaredField("name");
            
            //将权限修改为可获得
            name.setAccessible(true);
            
            //设置当前对象的属性值:set()方法:参数1:指明设置哪个对象的属性,参数2:将属性设置为多少
            name.set(person, "Tom");
            
            /*
             * 获取当前属性值get():参数1:获取哪个对象的属性值
             * */
            int pAge = (int)name.get(person);
            System.out.println(pAge);
        }
        
        /*
         * 操作运行时类中指定的方法
         * */
        @Test
        public void test2() throws InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException {
            Class clazz = Person.class;
            
            //创建运行时类对象
            Person person = (Person)clazz.newInstance();
            
            //获取指定的某个方法
            //参数1:指明获取方法的名称,参数2:指明获取方法的形参列表
            Method show = clazz.getDeclaredMethod("show", String.class);
            
            //将权限改为可访问
            show.setAccessible(true);
            
            //invoke():参数1:方法调用者 参数2:给方法形参赋值的实参
            //返回值 为调用的方法的返回值
            String nation = (String)show.invoke(person,"CHN");
            System.out.println(nation);
            
            
            System.out.println("*********************调用静态方法**********************");
            Method showDesc = clazz.getDeclaredMethod("showDesc");
            showDesc.setAccessible(true);
            //直接用这个类去调用就行
            showDesc.invoke(Person.class);
        }
        
        /*
         * 调用运行时类的指定的构造器
         * */
        @Test
        public void test3() throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
            Class clazz = Person.class;
            
            //获取指定的构造器:参数:指明构造器的参数列表
            Constructor constructor = clazz.getDeclaredConstructor(String.class);
            
            //将权限改为可访问
            constructor.setAccessible(true);
            
            Person person = (Person)constructor.newInstance("Tom");
            System.out.println( person);
        }
        
    }

    1

  • 相关阅读:
    C# 动态生成word文档
    C# 利用SharpZipLib生成压缩包
    C# 程序异常关闭时的捕获
    轻松学习UML之用例图,时序图
    轻松学习UML之类图,状态图
    C# 一款属于自己的音乐播放器
    C# MessageBox自动关闭
    C# 用户控件之温度计
    Html富文本编辑器
    java工作流引擎证照库类型的流程设计 实现方案与演示案例
  • 原文地址:https://www.cnblogs.com/zsben991126/p/11888622.html
Copyright © 2020-2023  润新知