}
举个栗子:
我们手机里的app要更新升级的时候,即使你不更新,也可以正常使用,但是不能使用更新的功能。我们的杀毒软件,需要下载一个功能插件时,不需要卸载掉重新安装完整版,只需要下载插件即可。这里面就用到了反射的知识哦。不需要重新编译,扩展所需功能即可。
代码示意:
假如有个Office,具有word、excel功能。
静态方式:
public interface OfficeAble {
public void print();
}
public class Word implements OfficeAble {
@Override
public void print() {
System.out.println(“word-----start”);
}
}
public class Excel implements OfficeAble {
@Override
public void print() {
System.out.println(“excel-------statrt”);
}
}
Office.java
public class Office {
public static OfficeAble fun(String name) {
OfficeAble officeAble = null;
if(“word”.equals(name)) {
officeAble = new Word();
}
if(“excel”.equals(name)) {
officeAble = new Excel();
}
return officeAble;
}
public static void main(String[] args) {
Office.fun(“word”).print();
Office.fun(“excel”).print();
}
}
静态的方式必须要保证Word、Excel这两个类必须存在。假如现在Office需要ppt的功能,就要新建一个Ppt类实现OfficeAble并且改写Office业务代码,并且还要重新编译运行。
动态方式:
public class OfficeBetter {
public static OfficeAble fun(String className) {
OfficeAble officeAble=null;
try {
//动态加载类
Class clazz = Class.forName(className);
officeAble = (OfficeAble) clazz.newInstance();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return officeAble;
}
public static void main(String[] args) {
OfficeBetter clazz = new OfficeBetter();
OfficeAble officeAble = clazz.fun(“demo.Ppt”);
officeAble.print();
}
}
动态方式,要ppt功能时只需要实现OfficeAble 即可,不需要改写Office的业务代码,不需要重新编译。
注:在编辑器里不好演示是否重新编译,可通过 javac命令在cmd中测试。
通过反射对构造器、方法、属性的操作:
User.java
package java_reflex;
public class User {
private Integer id;
private String username;
private String password;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public User(Integer id, String username, String password) {
super();
this.id = id;
this.username = username;
this.password = password;
}
public User() {
super();
// TODO Auto-generated constructor stub
}
public User(String username, String password) {
super();
this.username = username;
this.password = password;
}
@Override
public String toString() {
return “User [username=” + username + “, password=” + password + “]”;
}
private void hello() {
System.out.println(“hello world”);
}
}
test.java
package java_reflex;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class test {
public static void main(String[] args) {
try {
Class clazzUser = Class.forName(“java_reflex.User”);
Constructor[] constructors = clazzUser.getDeclaredConstructors();
System.out.println(“----------获取所有公有的构造器----------”);
for(Constructor c:constructors) {
System.out.println©;
}
Constructor con = clazzUser.getConstructor(String.class,String.class);
//con.setAccessible(true);
Object obj = con.newInstance(“stefan”,“password”);
System.out.println(“----------实例化----------”);
System.out.println(obj.toString());
Method[] methods = clazzUser.getMethods();
System.out.println(“----------获取所有公有方法----------”);
for(Method m :methods) {
System.out.println(m);
}
System.out.println(“----------获取所有私有方法----------”);
Method[] declaredmethods = clazzUser.getDeclaredMethods();
for(Method m :declaredmethods) {
System.out.println(m);
}
System.out.println(“----------setUsername的调用----------”);
Method setUsername = clazzUser.getMethod(“setUsername”, String.class);
Object obj1 = clazzUser.newInstance();
setUsername.invoke(obj1, “tom”);
System.out.println(obj1.toString());
System.out.println(“----------私有方法hello的调用----------”);
Method hello = clazzUser.getDeclaredMethod(“hello”, null);
hello.setAccessible(true);
hello.invoke(obj1, null);
System.out.println(“----------获得私有私有属性----------”);
Field[] fields = clazzUser.getDeclaredFields();
for(Field f:fields) {
System.out.println(f);
}
System.out.println(“----------username的set和get----------”);
Field username = clazzUser.getDeclaredField(“username”);
username.setAccessible(true);
Object obj2 = clazzUser.newInstance();
username.set(obj2, “xufanyun”);
System.out.println(username.get(obj2));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
运行结果:
----------获取所有公有的构造器----------
public java_reflex.User(java.lang.String,java.lang.String)
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
最后
很多程序员,整天沉浸在业务代码的 CRUD 中,业务中没有大量数据做并发,缺少实战经验,对并发仅仅停留在了解,做不到精通,所以总是与大厂擦肩而过。
我把私藏的这套并发体系的笔记和思维脑图分享出来,理论知识与项目实战的结合,我觉得只要你肯花时间用心学完这些,一定可以快速掌握并发编程。
不管是查缺补漏还是深度学习都能有非常不错的成效,需要的话记得帮忙点个赞支持一下
整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!
码获取!!(备注Java获取)**
最后
很多程序员,整天沉浸在业务代码的 CRUD 中,业务中没有大量数据做并发,缺少实战经验,对并发仅仅停留在了解,做不到精通,所以总是与大厂擦肩而过。
我把私藏的这套并发体系的笔记和思维脑图分享出来,理论知识与项目实战的结合,我觉得只要你肯花时间用心学完这些,一定可以快速掌握并发编程。
不管是查缺补漏还是深度学习都能有非常不错的成效,需要的话记得帮忙点个赞支持一下
整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!