java反射的基本使用
2014-11-25 23:31
429 查看
反射机制是java中非常重要的功能,熟练使用反射功能对实际的开发有很大的帮助。
一,通过反射获取对象实例
使用的对象User
通过class.forName() 获取对象,括号中是对象的全称
运行后输出:
User [id=id is ok , name=hi, age=2]
二,通过反射获取对象的属性,以及方法等
使用获取对象的属性
运行后输出:
public class java.lang.String id
private class java.lang.String name
protected int age
获取对象方法
运行后返回:
public class java.lang.String toString([Ljava.lang.Class;@4d12ee4f)
public class java.lang.String getName([Ljava.lang.Class;@15dbac11)
public void setName([Ljava.lang.Class;@8fd9b4d)
public class java.lang.String getId([Ljava.lang.Class;@41dee0d7)
public void setAge([Ljava.lang.Class;@f7b650a)
public void setId([Ljava.lang.Class;@6e267b76)
public int getAge([Ljava.lang.Class;@2073b879)
三,通过反射调用对象方法
运行后返回:
name:zhang shan' song
user:User [id=null, name=zhang shan' song, age=0]
四,动态代理的使用
接口
对象类
使用InvocationHandler实现自己的代理类
运行后返回:
before run:setName
设置名称为:hello
after run:setName
一,通过反射获取对象实例
使用的对象User
package whroid.java.reflect; public class User { public String id; private String name; protected int age; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "User [id=" + id + ", name=" + name + ", age=" + age + "]"; } }
通过class.forName() 获取对象,括号中是对象的全称
public static void main(String[] args) { try { Class cls = Class.forName("whroid.java.reflect.User"); User user = (User) cls.newInstance(); user.setAge(2); user.setId("id is ok "); user.setName("hi"); System.out.println(user); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) { e.printStackTrace(); } }
运行后输出:
User [id=id is ok , name=hi, age=2]
二,通过反射获取对象的属性,以及方法等
使用获取对象的属性
public static void main(String[] args) { Class<?> cls; try { cls = Class.forName("whroid.java.reflect.User"); Field[] fileds = cls.getDeclaredFields(); for (Field filed : fileds) { System.out.println(Modifier.toString(filed.getModifiers()) + " " + filed.getType() + " " + filed.getName()); } } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
运行后输出:
public class java.lang.String id
private class java.lang.String name
protected int age
获取对象方法
public static void main(String[] args) { Class<?> cls; try { cls = Class.forName("whroid.java.reflect.User"); Method[] methods = cls.getDeclaredMethods(); for (Method method : methods) { System.out.println(Modifier.toString(method.getModifiers())+" "+method.getReturnType()+" "+method.getName()+"("+method.getParameterTypes()+")"); } } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
运行后返回:
public class java.lang.String toString([Ljava.lang.Class;@4d12ee4f)
public class java.lang.String getName([Ljava.lang.Class;@15dbac11)
public void setName([Ljava.lang.Class;@8fd9b4d)
public class java.lang.String getId([Ljava.lang.Class;@41dee0d7)
public void setAge([Ljava.lang.Class;@f7b650a)
public void setId([Ljava.lang.Class;@6e267b76)
public int getAge([Ljava.lang.Class;@2073b879)
三,通过反射调用对象方法
public static void main(String[] args) { Class<?> cls; try { cls = Class.forName("whroid.java.reflect.User"); Method method = cls.getDeclaredMethod("setName", String.class); User user = (User) cls.newInstance(); method.invoke(user, "zhang shan' song"); Method getNameMethod = cls.getDeclaredMethod("getName"); String name = (String) getNameMethod.invoke(user); System.out.println("name:" + name); System.out.println("user:" + user); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
运行后返回:
name:zhang shan' song
user:User [id=null, name=zhang shan' song, age=0]
四,动态代理的使用
接口
package whroid.java.reflect; public interface IPersion { String getName(); void setName(String name); }
对象类
package whroid.java.reflect; public class ChinesePeople implements IPerson{ String name; @Override public String getName() { // TODO Auto-generated method stub return name; } @Override public void setName(String name) { // TODO Auto-generated method stub this.name= name; System.out.println("设置名称为:"+name); } @Override public String toString() { return "ChinesePeople [name=" + name + "]"; } }
使用InvocationHandler实现自己的代理类
package whroid.java.reflect; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; //我的代理类 public class TestInvocationHandler implements InvocationHandler { Object obj;//代理的对象 public TestInvocationHandler(Object obj) { this.obj = obj; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //在方法实际方法运行前,我的代理类进行运行前的相应操作 System.out.println("before run:"+method.getName()); //实际运行的方法 Object result = method.invoke(obj, args); //在方法实际运行后,我的代理类可以进行一些收尾工作 System.out.println("after run:"+method.getName()); return result; } public static void main(String[] args) { ChinesePeople people = new ChinesePeople(); //参数传入代理对象的类加载器和其对应的接口,以及传入代理对象的代理类 IPerson pe = (IPerson) Proxy.newProxyInstance(people.getClass() .getClassLoader(), people.getClass().getInterfaces(), new TestInvocationHandler(people)); pe.setName("hello"); } }
运行后返回:
before run:setName
设置名称为:hello
after run:setName
相关文章推荐
- java反射基本使用操作
- JAVA反射的基本使用
- java 反射的基本使用
- java反射基本使用(得到类中属性、方法、构造方法)
- java反射-java Class基本使用
- 加强eclipse的使用技巧。可变参数。基本数据类型自动装箱和拆箱。枚举。反射。数组反射的应用。ArrayList和HashSet。JavaBean
- java反射的基本使用
- Java反射基本概述及使用方法
- java 反射基本使用
- java中反射的基本使用方法
- Java反射基本使用方法 示例
- java反射的基本使用
- java中反射基本的方法以及使用
- Java数组特点及基本使用技巧
- JAVA反射使用手记
- 通过反射动态使用Java类(转)
- 使用Java 5特性来简化反射编程
- JAVA反射使用手记
- 使用Java5特性来简化反射编程
- Lucene的一些基本使用方法和概念 (JAVA)