Java反射机制
来源:互联网 发布:360检测网络异常 编辑:程序博客网 时间:2024/05/20 17:40
Java反射机制
反射我又给忘了 学了长时间不用就要忘 干脆写个提醒自己开发的博客
反射第一步:
三种方式获取类类型Clazz
//假设有一个User对象//1.通过对象 User u = new User();Class<?> clazz = u.getClass()//2.通过类Class<?> clazz = User.class//3.通过Class类Class<?> clazz = Class.forName(包名.类名)
拿到了clazz 其实无非就想获取类中的东西 包括:
1.构造器 2.属性字段 3.方法 4.类上的 或 属性上的 或 方法上的 注解
5.包…等等等等
前四个用的最多 直接上代码得了
属性 获取属性 对属性赋值
获取Class有三种方式 //1.对象.getClass() 2.类.class 3.Class.forName ChannelBindDay c = new ChannelBindDay(); Class<?> clazz1 = c.getClass(); System.out.println(clazz1); Class<?> clazz2 = ChannelBindDay.class; System.out.println(clazz2); Class<?> clazz3 = Class.forName("model.ChannelBindDay"); System.out.println(clazz3); //getFields 只能获取 父子类 public的属性// Field[] fields = clazz3.getFields();// System.out.println(fields.length);// for (Field field : fields) {// System.out.println(field.getName());// } // 获取Class 对象所表示的类或接口所声明的所有字段。包括公共、保护、默认(包)访问和私有字段,但不包括继承的字段// Field[] declaredFields = clazz3.getDeclaredFields();// for (Field declaredField : declaredFields) {// System.out.println(declaredField.getName());// } //属性赋值 Field name = clazz3.getDeclaredField("dimLevel"); //对私有的进行访问许可 name.setAccessible(true); ChannelBindDay o = (ChannelBindDay)clazz2.newInstance(); name.set(o,"何睿");// System.out.println(o.getDimLevel());
构造器 获取构造器 用构造器创建对象
Class<?> clazz = Class.forName("model.ChannelBindDay"); //获取public构造方法// Constructor<?>[] constructors = clazz.getConstructors();// for (Constructor<?> constructor : constructors) {// System.out.println(constructor.getName());// } //获取public构造方法// Constructor<?>[] declaredConstructors = clazz.getDeclaredConstructors();// for (Constructor<?> declaredConstructor : declaredConstructors) {// System.out.println(declaredConstructor.getName());// } //获取public参数为空的构造方法// Constructor<?> declaredConstructor = clazz.getDeclaredConstructor();// System.out.println(declaredConstructor.getName()); //获取public 参数为String构造方法// Constructor<?> declaredConstructor1 = clazz.getDeclaredConstructor(String.class);// System.out.println(declaredConstructor1.getName()); //创建对象 Constructor<?> constructor = clazz.getConstructor(); Object o = constructor.newInstance(); //创建对象 用另一个构造 Constructor<?> constructor1 = clazz.getDeclaredConstructor(String.class); constructor1.setAccessible(true); ChannelBindDay c = (ChannelBindDay)constructor1.newInstance("heh"); }
方法 获取方法 调用方法
Class<?> clazz = Class.forName("model.ChannelBindDay"); Object o = clazz.newInstance(); //获取所有public的方法 包含父类的 Object的 clazz.getMethods(); //获取当前类的方法 包含private Method[] methods = clazz.getDeclaredMethods(); for (Method method : methods) { System.out.println(method.getName()); } //获取无参数的say方法 Method m1 = clazz.getMethod("say"); m1.invoke(o); //获取有参数的dos方法 Method m2 = clazz.getMethod("dos", String.class); m2.invoke(o,"呵呵"); Method say1 = clazz.getDeclaredMethod("say1"); say1.setAccessible(true); say1.invoke(o);
注解 获取注解 获取注解中的值
注意这个 X.isAnnotationPresent(注解.class) 判断当前Obj上有没有这个注解 很有用
Class<?> clazz = Class.forName("model.ChannelBindDay"); //获取类上的注解 Annotation[] annotations = clazz.getAnnotations(); for (Annotation annotation : annotations) { System.out.println(annotation); } Field field = clazz.getDeclaredField("dimLevel"); Annotation[] annotations1 = field.getAnnotations(); for (Annotation annotation : annotations1) { //该字段上是否有某注解 if(field.isAnnotationPresent(Ano.class)){ System.out.println(1); Ano a = field.getAnnotation(Ano.class); System.out.println(a.value()); } } }
详细博客参考 https://www.cnblogs.com/jalja/p/6084445.html 讲的很好
阅读全文
0 0
- 【反射】JAVA反射机制
- 【Java】JAVA反射机制
- Java 反射机制[Field反射]
- Java 反射机制[Method反射]
- Java反射机制笔记-反射机制
- java的反射机制
- Java的反射机制
- java反射机制详解!
- Java反射机制
- Java的反射机制
- java 反射机制--侯捷
- java反射机制
- java反射机制
- [候捷]Java反射机制
- java 反射机制
- java 反射机制初探
- 关于Java反射机制
- java反射机制
- 每日一记:2017.11.24
- Bluetooth LE(低功耗蓝牙) 系列
- 务隔离级别详解
- windpws 10打开开发模式后安装ubuntu后如何连接其桌面
- NodeMCU中Out Of Memory的解决方法
- Java反射机制
- lucence maven
- 扫描识别工具Dynamic Web TWAIN使用教程:建立一个“Hello World”扫描页面
- 机器学习#假设空间与版本空间
- 5.2 子类的继承性
- TensorFlow学习--VGGNet实现&图像识别
- Mysql千万级别数据批量插入只需简单三步
- 以太坊开发者大会Devcon3——总览
- PE文件结构详解(二)可执行文件头