Class对象、反射、动态代理
2015-01-13 14:58
405 查看
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);
}
}
编译后的新类会产生一个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);
}
}
相关文章推荐
- 【Java核心技术】类型信息(Class对象 反射 动态代理)
- Java_反射(Class文件对象 / 反射 / 动态代理)
- 第十四章 类型信息 反射 动态代理 空对象 接口和类型信息
- java.lang.Class<T> -- 反射机制及动态代理
- 关于使用动态代理创建代理对象是报错 java.lang.ClassCastException: $Proxy0 cannot be cast to 的解决办法
- 通过反射创建动态代理对象(一)
- 通过反射创建动态代理对象(二)
- 反射机制_介绍_Class对象获取_动态操作_构造器_方法_属性JAVA211-212
- java反射并不是什么高深技术,面向对象语言都有这个功能,而且功能也很简单,就是利用jvm动态加载时生成的class对象
- 黑马程序员--09.动态与代理AOP--03【InvocationHandler接口】【通过反射创建动态代理类对象】
- 通过反射创建动态代理对象(三)
- 使用反射-动态创建对象及调用对象方法
- 使用.Net Reflection 反射机制 动态获取对象字段内容的示例
- 利用反射动态创建对象
- 反射实现 AOP 动态代理模式(Spring AOP 的实现 原理)
- PHP 反射机制实现动态代理的代码
- 通过反射动态实例化对象中出现的一个奇怪问题
- 动态创建菜单,menustrip,根据权限显示菜单,控制菜单可用,反射,给窗体传值,反射对象传值,public static Object CreateInstance ( Type type, params Object[] args )
- 使用反射-动态创建对象及调用对象方法
- [转载]利用反射动态创建对象