注解与反射
//定义一个注解
//Target 表示注解可以用在哪些地方
@Target(value = {ElementType.METHOD,ElementType.TYPE})
//Retention 表示注解在什么地方还有效(runtime>class>source)
@Retention(RetentionPolicy.CLASS)
//Documented 是否将注解生成在doc中
@Documented
//Inherited 子类可继承父类的注解
@Inherited
方法区别名Non-Heap(非堆) 8之后方法区叫元空间
Class类创建:
- 通过对象获得person.getclass();
- forname获得Class.forname("com.xx.reflection.Test05")
- 通过类名.class获得Student.class;
- 基本内置类型的包装类都有一个Type属性Interger.TYPE;
Class类常用方法:
- static ClassfoaName(String name):返回指定类名name的Class对象
- Object newInstance():调用缺省构造函数,返回Class对象的一个实例
- getName():返回此Class对象所表示的尸体(类,接口,数组类或者void)的名称
- Class getSuperClass():返回当前Class对象的父类的Class对象
- Class[] getinterfaces():获取Class对象的接口
- ClassLoader getClassLoader():返回该类的类加载器
- Constructor[] getConstructor():返回一个包含某些Constructor对象数组
- Method getMothed(Stringname,Class..):返回一个Method对像,此对象形参为paramType
- Field[] getDeclaredFields():返回Field对象的一个数组
1.getDeclaredConstructor(Class...parameterTypes)取得本类指定形参的构造方法
2.想构造器的形参传递一个对象数组,里面包含了构造器所需的所有参数
3.通过Constructor实例化对象
Object invoke(Object obj,Object... args)
要访问private方法或者属性需要调用setAccessible(true)启动和禁用访问安全检查开关
//通过反射调用普通方法
User user3 = (User) c1.newInstance();
//通过反射获取一个方法
Method setName = c1.getDeclaredMethod("setName", String.class);
//invoke:激活的意思---(对象,“方法的值”)
setName.invoke(user3,"xxx");
System.out.println(user3.getName());
//通过反射操作属性
User user4 = (User) c1.newInstance();
Field name = c1.getDeclaredField("name");
//不能直接操作私有属性,我们需要关闭程序的安全监测,属性或者方法的setAccessible(true)
name.setAccessible(true);
name.set(user4,"bbb");
System.out.println(user4.getName());
getField()获取不了private修饰的属性,得用getDeclaredField()获取私有;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)