Java-反射


一、反射是什么

Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于 Reflection API 取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。

二、创建对象的三种方式

(1)Class clazz = 类名.class
(2)Class clazz = 对象.getClass()
(3)Class clazz = Class.forName(“类的全类名”) 最常用
(4)ClassLoader cl = this.getclass().getClassLoader()
Class clazz = cl.loadClass(“类的全类名”)了解

三、加载外部资源的两种方式

(1)直接使用new
路径是在当前工程或Module下

	@Test
    public void test1() throws Exception{
        Properties prop = new Properties();
        FileInputStream file = new FileInputStream("jdbc.properties");
        prop.load(file);
        String username = prop.getProperty("username");
        String password = prop.getProperty("password");
        System.out.println("username = "+ username + ", password = "+ password);
    }

(2)类的加载器
路径是在src目录下

	@Test
    public void test1() throws Exception{
        Properties prop = new Properties();

        ClassLoader classLoader = ClassLoderTest.class.getClassLoader();
        InputStream is = classLoader.getResourceAsStream("jdbc1.properties");
        prop.load(is);
        String username = prop.getProperty("username");
        String password = prop.getProperty("password");
        System.out.println("username = "+ username + ", password = "+ password);
    }

使用方法

创建运行时类对象及调用成员变量

newInstance()
getDeclaredField(变量名)
setAccessible(true)
Field对象.set(对象、值)
Field对象.get(对象)

@Test
    public void FieldTest() throws Exception{
        Class clazz = Person.class;
        Person p = (Person) clazz.newInstance();
        Field name = clazz.getDeclaredField("name");
        name.setAccessible(true);
        name.set(p, "Tom");
        System.out.println(name.get(p));
    }

调用方法

getDeclaredMethod(方法名、形参类型)
setAccessible(true)
returnVal = 方法名.invoke(对象, 实参)
returnVal =方法名.invoke(null,实参) 静态方法

@Test
    public void testMethod() throws Exception{
        Class clazz = Person.class;
        Person p = (Person) clazz.newInstance();
        Method show = clazz.getDeclaredMethod("show", String.class);
        show.setAccessible(true);
        Object obj = show.invoke(p, "CHN");
        System.out.println(obj);
        System.out.println("*****************************");
        Method showDesc = clazz.getDeclaredMethod("showDesc");
        showDesc.setAccessible(true);
        Object returnVal = showDesc.invoke(null);
        System.out.println(returnVal);
    }

构造器

getDeclaredConstructor(形参类型)
setAccessible(true)
newInstance(实参)

@Test
    public void testConstructor() throws Exception{
        Class clazz = Person.class;
        Constructor declaredConstructor = clazz.getDeclaredConstructor(String.class);
        declaredConstructor.setAccessible(true);
        Person person = (Person) declaredConstructor.newInstance("Tom");
        System.out.println(person);
    }

获取运行时类的带泛型的父类的泛型

getGenericSuperclass()
ParameterizedType强制转换
getActualTypeArguments()
getTypeName()

@Test
    public void test4(){
        Class clazz = Person.class;
        Type genericSuperclass = clazz.getGenericSuperclass();
        ParameterizedType paramType = (ParameterizedType) genericSuperclass;
        Type[] actualTypeArguments = paramType.getActualTypeArguments();
        for (Type a:actualTypeArguments){
            System.out.println(a.getTypeName());
        }
    }

总结

fine

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值