Java反射——框架设计的灵魂,从基础到源码统统帮你搞定

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)

public java_reflex.User()

public java_reflex.User(java.lang.Integer,java.lang.String,java.lang.String)

----------实例化----------

User [username=stefan, password=password]

----------获取所有公有方法----------

public java.lang.String java_reflex.User.toString()

public java.lang.Integer java_reflex.User.getId()

public void java_reflex.User.setId(java.lang.Integer)

public void java_reflex.User.setUsername(java.lang.String)

public java.lang.String java_reflex.User.getPassword()

public void java_reflex.User.setPassword(java.lang.String)

public java.lang.String java_reflex.User.getUsername()

public final void java.lang.Object.wait() throws java.lang.InterruptedException

public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException

public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException

public boolean java.lang.Object.equals(java.lang.Object)

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

总结

面试难免让人焦虑不安。经历过的人都懂的。但是如果你提前预测面试官要问你的问题并想出得体的回答方式,就会容易很多。

此外,都说“面试造火箭,工作拧螺丝”,那对于准备面试的朋友,你只需懂一个字:刷!

给我刷刷刷刷,使劲儿刷刷刷刷刷!今天既是来谈面试的,那就必须得来整点面试真题,这不花了我整28天,做了份“Java一线大厂高岗面试题解析合集:JAVA基础-中级-高级面试+SSM框架+分布式+性能调优+微服务+并发编程+网络+设计模式+数据结构与算法等”

image

且除了单纯的刷题,也得需准备一本【JAVA进阶核心知识手册】:JVM、JAVA集合、JAVA多线程并发、JAVA基础、Spring 原理、微服务、Netty与RPC、网络、日志、Zookeeper、Kafka、RabbitMQ、Hbase、MongoDB、Cassandra、设计模式、负载均衡、数据库、一致性算法、JAVA算法、数据结构、加密算法、分布式缓存、Hadoop、Spark、Storm、YARN、机器学习、云计算,用来查漏补缺最好不过。

image

说“面试造火箭,工作拧螺丝”,那对于准备面试的朋友,你只需懂一个字:刷!

给我刷刷刷刷,使劲儿刷刷刷刷刷!今天既是来谈面试的,那就必须得来整点面试真题,这不花了我整28天,做了份“Java一线大厂高岗面试题解析合集:JAVA基础-中级-高级面试+SSM框架+分布式+性能调优+微服务+并发编程+网络+设计模式+数据结构与算法等”

[外链图片转存中…(img-YrtfiSSA-1712087133990)]

且除了单纯的刷题,也得需准备一本【JAVA进阶核心知识手册】:JVM、JAVA集合、JAVA多线程并发、JAVA基础、Spring 原理、微服务、Netty与RPC、网络、日志、Zookeeper、Kafka、RabbitMQ、Hbase、MongoDB、Cassandra、设计模式、负载均衡、数据库、一致性算法、JAVA算法、数据结构、加密算法、分布式缓存、Hadoop、Spark、Storm、YARN、机器学习、云计算,用来查漏补缺最好不过。

[外链图片转存中…(img-yajephxF-1712087133990)]

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值