Java之六:Java Reflection
来源:互联网 发布:图片二维码识别软件 编辑:程序博客网 时间:2024/04/27 10:53
本博文主要讲诉Java
Java
我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
Java
位于java.lang.reflect包中。
Class类:代表一个类。
Field类:代表类的成员变量(成员变量也称为类的属性)。
Method类:代表类的方法。
Constructor
Proxy类:提供用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类。
InvocationHandler类:是代理实例的调用处理程序实现的接口,每个代理实例都具有一个关联的调用处理程序。对代理实例调用方法时,将对方法调用进行编码并将其指派到它的调用处理程序的invoke 方法。
Java
在运行时判断任意一个对象所属的类
public
public
static void main(String[] args){
String
s = new String("evan"); Class
c = s.getClass(); System.out.println(c.getName());
Class
sc = c.getSuperclass(); System.out.println(sc.getName());
}
}
在运行时构造任意一个类的对象
import
import
public
public
static void main(String[] args) throws ClassNotFoundException,
InstantiationException,
IllegalAccessException, SecurityException, NoSuchMethodException, IllegalArgumentException , InvocationTargetExceptio n {
Class
c = Class.forName("java.lang.String"); Class[]
pTypes = new Class[] { String.class }; Constructor
ctor = c.getConstructor(pTypes); Object[]
para = new Object[] { "evan" }; Object
o = ctor.newInstance(para); System.out.println(o);
}
}
在运行时判断任意一个类所具有的成员变量和方法
import
import
public
public
static void main(String[] args) throws ClassNotFoundException {
Class
c = Class.forName("java.lang.String"); Field[]
fi = c.getDeclaredFields(); Method[]
fu = c.getDeclaredMethods(); for
(int i = 0; i < fi.length; i++) {
System.out.println("filed
" + i + " " + fi[i].toGenericString());
}
for
(int i = 0; i < fu.length; i++) {
System.out.println("method
" + i + " " +fu[i].toGenericString());
}
}
}
在运行时调用任意一个对象的方法
import
import
import
public
public
static void main(String[] args) throws ClassNotFoundException,
InstantiationException,
IllegalAccessException, SecurityException, NoSuchMethodException,
IllegalArgumentException ,
InvocationTargetExceptio
n {
Class
c = Class.forName("java.lang.String"); Class[]
pTypes = new Class[] { String.class }; Constructor
ctor = c.getConstructor(pTypes); Object[]
para = new Object[] { "EVAN" }; Object
o = ctor.newInstance(para); System.out.println(o);
Method
m = c.getMethod("toLowerCase"); Object
ans = m.invoke(o); System.out.println(ans);
}
}
生成动态代理:为其他对象提供一种代理以控制对这个对象的访问
定义抽象角色
public
public
int add(int a , int b);
}
定义真实角色
public
public
int add(int a , int b){
return
a+b;
}
}
定义代理角色
import
import
public
private
Object sub;
public
DynamicSubject(Object obj) { this.sub
= obj; }
@Override
public
Object invoke(Object proxy, Method method, Object[] args) throws
Throwable {
System.out.println("Method:"
+ method + ",Args:" + args); return
method.invoke(sub, args);
}
}
通过Proxy.newProxyInstance构建代理对象
import
import
public
public
static void main(String[] args){
CalculatorImpl realSub = new CalculatorImpl();
InvocationHandler handler = new DynamicSubject(realSub);
Class classType =handler.getClass();
//通过Proxy.newProxyInstance构建代理对象
Calculator sub =(Calculator)Proxy.newProxyInstance(classType.getClassLoader(),
realSub.getClass().getInterfaces(), handler);
System.out.println(sub.getClass());
System.out.println(sub.add(1,2)); }
- Java之六:Java Reflection
- JAVA 基础知识(六) Reflection
- Java Reflection 之 Method
- Java Reflection 之 Array
- Java之Reflection
- Java Reflection(六):Getters and Setters
- Java Reflection(六):Getters and Setters
- Java Reflection(六):Getters and Setters
- Java学习之反射--Reflection
- java学习之reflection反射
- Java Reflection
- Java Reflection
- Java Reflection
- Java Reflection
- java Reflection
- Java Reflection
- java reflection
- Java Reflection
- Java之一:Serialization(序列化…
- Java之二:工厂模式
- Java之三:Java类的装载、链接和初始化
- Java之四:类的加载器ClassLoader
- Java之五:Java实例化类的方法
- Java之六:Java Reflection
- 分布式系统之四:间接通信
- 分布式系统之五:进程/线程
- 原来恐慌一场
- Curling 2.0
- c# 去除bom文件头
- Windows中的精度定时问题
- 3D建模和3D渲染技术专题一: 热身篇,光线追踪(path Tracing),环境光阴影(ambient occlusion),焦距效果(effect focus)介绍
- JavaScript图片裁剪