栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java-反射

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1032103.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号