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

  • 相关阅读:
    mybatis :xml文件中传入参数和if标签结合使用时要点
    mysql:查询数据库版本的几种方式
    http post 方法传递参数的2种方式
    深入理解mybatis参数
    Mybatis:动态sql
    Mybatis:传入参数方式以及#{}与${}的区别
    [GLSL]着色器周记02——火焰特效 【转】
    OpenGL ES入门09-GLSL实现常见特效 [转]
    RenderMonkey 练习 第五天 【OpenGL NormalMapping】
    反射向量 及 向量投影
  • 原文地址:https://www.cnblogs.com/zsben991126/p/11888622.html
Copyright © 2011-2022 走看看