Java 反射机制
来源:互联网 发布:php list注意 编辑:程序博客网 时间:2024/06/05 23:06
1 简介
Java 反射机制就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
用一句话总结就是反射机制可以在运行时知道任意一个类的属性和方法。
Java 反射机制拥有如下优点和缺点。
- 优点:可以实现动态创建对象和编译,体现出很大的灵活性,特别是在J2EE的开发中它的灵活性就表现的十分明显。比如,一个大型的软件,不可能一次就把把它设计的很完美,当这个程序编译后,发布了,当发现需要更新某些功能时,我们不可能要用户把以前的卸载,再重新安装新的版本,假如这样的话,这个软件肯定是没有多少人用的。采用静态的话,需要把整个程序重新编译一次才可以实现功能的更新,而采用反射机制的话,它就可以不用卸载,只需要在运行时才动态的创建和编译,就可以实现该功能。
- 缺点:对性能有影响。
测试代码,后面基于此做讲解。
基类 Base.java
package com.yjcocoa.reflection;public class Base { public String superField; public void superMethod() { }}
子类 User.java
package com.yjcocoa.reflection;public class User extends Base { public static String language = "JAVA"; private String name; public String qq; public static User user(String name, String qq) { return new User(name, qq); } public User() { } public User(String name, String qq) { this.name = name; this.qq = qq; } private User(String name) { // 私有构造器 this.name = name; } @Override public String toString() { return "User{" + "name='" + name + '\'' + ", qq='" + qq + '\'' + '}'; } public String getName() { return name; } private void setName(String name) { // 私有 setter this.name = name; }}
2 Class
类是 java.lang.Class 类的实例对象,通过反射机制我们可以使用不同的获取 class。
Class class1 = User.class;System.out.println(class1.getName());//第二种User demo2 = new User();Class c2 = demo2.getClass();System.out.println(c2.getName());//第三种Class class3 = Class.forName("com.yjcocoa.reflection.User");System.out.println(class3.getName());
输出
com.yjcocoa.reflection.Usercom.yjcocoa.reflection.Usercom.yjcocoa.reflection.User
3 Field
字段的反射对象是 java.lang.reflect.Field。
Class uc = User.class;// 获取所有字段for (Field field : uc.getDeclaredFields()) { System.out.println(field);}System.out.println();// 获取所有 public 字段,包含父类字段for (Field field : uc.getFields()) { System.out.println(field);}System.out.println();// private 字段 name 赋值Field field = uc.getDeclaredField("name");field.setAccessible(true);User user = new User();field.set(user, "YJ"); // set 方法System.out.println(user.getName() + ";" + field.get(user)); // get 方法
输出
public static java.lang.String com.yjcocoa.reflection.User.languageprivate java.lang.String com.yjcocoa.reflection.User.namepublic java.lang.String com.yjcocoa.reflection.User.qqpublic static java.lang.String com.yjcocoa.reflection.User.languagepublic java.lang.String com.yjcocoa.reflection.User.qqpublic java.lang.String com.yjcocoa.reflection.Base.superFieldYJ;YJ
4 Constructor
构造函数的反射对象是 java.lang.reflect.Constructor。
Class uc = User.class;// 获取所有构造器for (Constructor constructor : uc.getDeclaredConstructors()) { System.out.println(constructor);}System.out.println();// 获取所有public 构造器for (Constructor constructor : uc.getConstructors()) { System.out.println(constructor);}System.out.println();// private 构造器 初始化Constructor<User> constructor = uc.getDeclaredConstructor(String.class);constructor.setAccessible(true); // private 需要开启允许访问User user = constructor.newInstance("YJ");System.out.println(user);
输出
public com.yjcocoa.reflection.User(java.lang.String,java.lang.String)public com.yjcocoa.reflection.User()private com.yjcocoa.reflection.User(java.lang.String)public com.yjcocoa.reflection.User(java.lang.String,java.lang.String)public com.yjcocoa.reflection.User()User{name='YJ', qq='null'}
5 Method
方法的反射对象是 java.lang.reflect.Method。
Class uc = User.class;// 获取所有方法for (Method method : uc.getDeclaredMethods()) { System.out.println(method);}System.out.println();// 获取所有 public 方法,包含父类方法for (Method method : uc.getMethods()) { System.out.println(method);}System.out.println();// private 方法调用Method method = uc.getDeclaredMethod("setName", String.class);method.setAccessible(true);User user = new User();method.invoke(user, "YJ");System.out.println(user);
输出
public java.lang.String com.yjcocoa.reflection.User.toString()public java.lang.String com.yjcocoa.reflection.User.getName()private void com.yjcocoa.reflection.User.setName(java.lang.String)public static com.yjcocoa.reflection.User com.yjcocoa.reflection.User.user(java.lang.String,java.lang.String)public java.lang.String com.yjcocoa.reflection.User.toString()public java.lang.String com.yjcocoa.reflection.User.getName()public static com.yjcocoa.reflection.User com.yjcocoa.reflection.User.user(java.lang.String,java.lang.String)public void com.yjcocoa.reflection.Base.superMethod()public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedExceptionpublic final void java.lang.Object.wait() throws java.lang.InterruptedExceptionpublic final native void java.lang.Object.wait(long) throws java.lang.InterruptedExceptionpublic boolean java.lang.Object.equals(java.lang.Object)public native int java.lang.Object.hashCode()public final native java.lang.Class java.lang.Object.getClass()public final native void java.lang.Object.notify()public final native void java.lang.Object.notifyAll()User{name='YJ', qq='null'}
Appendix
Related Documentation
JAVA反射与注解
Revision History
Copyright
CSDN:http://blog.csdn.net/y550918116j
GitHub:https://github.com/937447974
阅读全文
0 0
- 【反射】JAVA反射机制
- 【Java】JAVA反射机制
- Java 反射机制[Field反射]
- Java 反射机制[Method反射]
- Java反射机制笔记-反射机制
- java的反射机制
- Java的反射机制
- java反射机制详解!
- Java反射机制
- Java的反射机制
- java 反射机制--侯捷
- java反射机制
- java反射机制
- [候捷]Java反射机制
- java 反射机制
- java 反射机制初探
- 关于Java反射机制
- java反射机制
- 欢迎使用CSDN-markdown编辑器
- dobbo配置
- 2048游戏(java控制台-原生jdk实现)
- python3正则模块中的(?(id)yes|no)构造
- Scroller
- Java 反射机制
- 文章标题
- python 写的方法返回的是个中文,在 rf 日志中显示的却是乱码解决方法
- PHP之static静态变量详解(一)
- Adversarial Sample misleading the Model(生成对抗样本迷惑模型)
- 问题Incompatible ssh peer
- 2.python连接mongodb,利用微博数据制作云图
- 让一个div居于页面中间,水平居中同时垂直居中
- goim(1):学习goim ,使用docker安装kafka 镜像