Java反射机制与动态代理,java反射机制
分享于 点击 13436 次 点评:18
Java反射机制与动态代理,java反射机制
三种获取当前的Class类对象
1)Object类中有一个方法:getClass()
2)通过数据类型的静态属性;String.class,int.class,Person.class
3)Class类中提供了一一个方法:forName(“当前类的全路径名称”);
Class类应用
Field
getField() getFields() getDeclaredField() getDeclaredFields()
Constructor
getConstrutor() getConstrutors() getConDeclaredConstructor() getConDeclaredConstructors()
Method
getMethod() getMethods() getDeclaredMethod() getDeclaredMethods()
带s返回的是数组,带Declared返回的指定 啥都不加返回的公有
//下面是常的的反射方法
public class Person {
private String name ;
int age ;
public String address ;
public Person(){
}
//构造方法
private Person(String name){
this.name = name ;
}
Person(String name,int age){
this.name = name ;
this.age = age ;
}
public Person(String name,int age,String address){
this.name = name ;
this.age = age ;
this.address = address ;
}
//成员方法
public void show(){
System.out.println("show");
}
public void method(String s){
System.out.println("method"+s);
}
public String getString(String s,int i){
return s+"---"+i ;
}
private void function(){
System.out.println("function");
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", address=" + address
+ "]";
}
}
--------------------------------------------------------------------
//用构造器建立对象 线面代码要用到
//public Constructor<T> getConstructor(Class<?>... parameterTypes)
Constructor con = c.getConstructor(String.class,int.class,String.class) ;
Object obj = con.newInstance();
重点是但参数的方法反射格式的写法,如获取指定参数的时候c.getMethod("getString", String.class,int.class)
"getString"表示方法名.其他的自己可以试一试
1有参构造方法
//有参数的构造方法
//public Constructor<T> getConstructor(Class<?>... parameterTypes)
Constructor con = c.getConstructor(String.class,int.class,String.class) ;
//创建构造方法的实例:NewInstance(Object...args):传递的是实际操作
Object obj = con.newInstance("高圆圆",27,"户县");
//输出当前这个对象
System.out.println(obj);
2获取字段
//获取指定的字段的方法
Field nameField = c.getDeclaredField("name") ;
nameField.setAccessible(true) ;
nameField.set(obj, "高圆圆");
3单个的公共方法的获取
Method m3 = c.getMethod("getString", String.class,int.class) ;
//调用方法进行实际参数的传递
Object resultString = m3.invoke(obj, "world",100);
System.out.println(resultString);
动态代理
/*
代理类
*/
public class Main {
public static void main(String[] args) {
UserDao ud=new UserDaoImpl();
MyInvocationHandler mih=new MyInvocationHandler(ud);
UserDao proxy=(UserDao) Proxy.newProxyInstance(ud.getClass().getClassLoader(),
ud.getClass().getInterfaces(), mih);
proxy.add();
proxy.delete();
}
}
/*
*
* InvocationHandler 是代理实例的调用处理程序 实现的接口。
每个代理实例都具有一个关联的调用处理程序。对代理实例调用方法时,
将对方法调用进行编码并将其指派到它的调用处理程序的 invoke 方法。
- */
public class MyInvocationHandler implements InvocationHandler{
//
public Object target;
public MyInvocationHandler(Object target) {
this.target=target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// TODO Auto-generated method stub
Object result=method.invoke(target, args);
return result;
}
}
public interface UserDao {
public void delete();
public void add();
public void update();
public void find();
}
public class UserDaoImpl implements UserDao{
@Override
public void delete() {
// TODO Auto-generated method stub
System.out.println("实现功能");
}
@Override
public void add() {
// TODO Auto-generated method stub
System.out.println("实现功能");
}
@Override
public void update() {
// TODO Auto-generated method stub
System.out.println("实现功能");
}
@Override
public void find() {
// TODO Auto-generated method stub
System.out.println("实现功能");
}
}
相关文章
- 暂无相关文章
用户点评