Python 官方文档:入门教程 => 点击学习
目录1.反射的作用2.反射的优缺点3.反射的应用场景4.说一下反射的相关类有哪些5.获取Class对象的六种方式1.反射的作用 它赋予了我们在运行时分析类以及执行类中方法的能力。通过
它赋予了我们在运行时分析类以及执行类中方法的能力。通过反射你可以获取任意一个类的所有属性和方法,你还可以调用这些方法和属性
反射让我们在运行时有了分析操作类的能力,反射可以让我们的代码更加灵活、为各种框架提供开箱即用的功能提供了便利。
增加了安全问题,比如可以无视泛型参数的安全检查(泛型参数的安全检查发生在编译时)
另外,反射的性能也要稍差点,不过,对于框架来说实际是影响不大的
spring/Spring Boot、mybatis 等等框架中都大量使用了反射机制
Java动态代理的实现也依赖反射
Java 中的一大利器 注解 的实现也用到了反射
public class reflectionTest {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
// 类的路径
String classPath = "reflection.Cat";
// 要执行类的方法名称
String claSSMethod = "hi";
// 加载类
Class cls = Class.forName(classPath);
// 通过cls得到你加载的类Cat的对象实例
Object o = cls.newInstance();
// 查看o的运行类型,为Cat类型
System.out.println(o.getClass()); // class reflection.Cat
// 得到加载的类的方法对象
// 在反射中,可以把方法视为对象
Method method = cls.getMethod(classMethod);
// 通过method实例调用方法:即通过方法对象来实现调用方法
method.invoke(o); // 喵喵喵~
// 得到name字段的信息
// 注意:getField不能得到私有的属性信息
Field nameField = cls.getField("name");
System.out.println(nameField.get(o)); // 豹猫(我们定义的属性名字)
// 得到构造器
Constructor constructor = cls.getConstructor();
System.out.println(constructor); // public reflection.Cat()
}
}
forName获取。多用于配置文件读取类的全路径,加载类
String classAllPath = "reflection.Cat";
Class ccls = Class.forName(classAllPath);
类名.class。多用于参数传递
System.out.println(String.class); // class java.lang.String
System.out.println(Cat.class); // class reflection.Cat
对象.getClass。适用于已经存在对象实例的情况
Cat cat = new Cat();
System.out.println(cat.getClass()); // class reflection.Cat
通过类加载器获取Class对象,通过类加载器获取 Class 对象不会进行初始化,意味着不进行包括初始化等一系列步骤,静态代码块和静态对象不会得到执行
String classAllPath = "reflection.Cat";
Cat cat = new Cat();
// (1)得到类加载器
ClassLoader classLoader = cat.getClass().getClassLoader();
// (2)通过类加载器得到Class对象
Class<?> cls = classLoader.loadClass(classAllPath);
System.out.println(cls); // class reflection.Cat
基本数据类型通过.class获取Class对象
Class<Integer> integerClass = int.class;
Class<Character> characterClass = char.class;
Class<Boolean> booleanClass = boolean.class;
System.out.println(integerClass); // int
基本数据类型的包装类可以通过.TYPE得到Class对象
Class<Integer> type = Integer.TYPE;
System.out.println(type); // int
到此这篇关于Java高级特性基础之反射五连问的文章就介绍到这了,更多相关Java高级特性内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
--结束END--
本文标题: Java高级特性基础之反射五连问
本文链接: https://www.lsjlt.com/news/177371.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-03-01
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0