注解与反射

//定义一个注解
//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()获取私有;

posted @   ice204  阅读(77)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示