Class对象、反射、动态代理
Class对象是所有类的根源,Object是所有对象的根源。
编译后的新类会产生一个Class对象,保存在同名的.class文件中。每个类都有一个Class对象,它包含了所有的与类有关的信息。所有的Class对象都是在第一次使用时,动态加载到jvm中的。
反射:在运行时打开和检查.class文件,通过来访问Class对象属性以及方法,Class类与java.lang.reflect类库一起对反射进行了支持。
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Student {
private String name;
private int flag;
public String sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getFlag() {
return flag;
}
public void setFlag(int flag) {
this.flag = flag;
}
public boolean isRight(int flag) {
return flag > 60;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public static void main(String[] args) {
try {
Class<?> clazz = Class
.forName("com.leadbank.basic.reflect.Student");
Object obj = clazz.newInstance();
Field[] field = clazz.getFields();
for (Field temp : field) {
System.out.println(temp.getType() + "------" + temp.getName());
}
Method[] method = clazz.getMethods();
for (Method temp : method) {
System.out.println(temp.toGenericString() + "------"
+ temp.getName());
if (temp.toGenericString().contains("isRight")) {
Integer i=80;
Object o=temp.invoke(obj,i);
System.out.println(o);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
动态代理:通过反射机制动态访问类
接口
public interface Interface {
public String sysout(String name);
}
实现类
public class RealObject implements Interface {
public String sysout(String name) {
return "hello!" + name;
}
}
代理类
public class DynamicProxyHandler implements InvocationHandler {
private Object proxy;
public DynamicProxyHandler(Object proxy) {
this.proxy = proxy;
}
public Object invoke(Object obj, Method method, Object[] args)
throws Throwable {
return method.invoke(proxy, args);
}
public static void main(String[] args) {
RealObject ro = new RealObject();
Interface proxy=(Interface) Proxy.newProxyInstance(Interface.class.getClassLoader(), new Class[]{Interface.class}, new DynamicProxyHandler(ro));
Object obj=proxy.sysout("jack");
System.out.println(obj);
}
}
最新文章
- 新人入职100天,聊聊自己的经验&;教训
- PowerDesigner 逆向工程 Mariadb 失败
- MAC使用CocoaPods
- (转)定制iOS 7中的导航栏和状态栏
- Javascript原型钩沉
- Android 首次进入应用时加载引导界面
- js获取网页屏幕可见区域高度
- VS2017使用 SQL Localdb问题两则
- Python基础练习题100例(Python 3.x)
- 学习easyui的小伙伴有福利了
- Java 8 Nashorn JavaScript
- 2019.03.26 bzoj4447: [Scoi2015]小凸解密码(线段树)
- pycharm常用设置和快捷键大全
- JavaScript高级特性-数组
- EF 踩过的坑
- pdb学习笔记
- 在windows下的hdfs客户端编写
- centos7下安装ossec
- 在 if 条件句中使用向量
- 【刷题】BZOJ 1001 [BeiJing2006]狼抓兔子
热门文章
- getAnnotation的一个坑
- JavaScript学习系列博客_18_JavaScript中的匿名函数
- DP搬运工1 [来自yyy--mengbier的预设型dp]
- 设置Anaconda启动jupyter的默认目录
- 第 1 篇 Scrum 冲刺博客(5.21)
- 区块链入门到实战(19)之以太坊(Ethereum) – 以太币
- Asp.Net Core Swagger 接口分组(支持接口一对多暴露)
- 无法创建新虚拟机: 无法打开配置文件“F:\BigData\vm12\centos01\centos01.vmx”: 拒绝访问。
- python爬虫实战---爬取大众点评评论
- 使用kind快速创建本地集群