1,java 的反射 让我们可以通过字符串类名生成类的实例,调用类方法,或者传递一个实例调用该实例的方法(例如通过反射调用该实例的多个方法)
2,框架的实现大多使用了反射技术,只要有配置类名的地方就有反射的存在(例如struts的action配置、Hibernate 的
对象持久层的映射配置,以及spring的bean的配置)
3,反射的用处:动态的创建实例,动态的调用方法,以及动态的修改字段。
java的反射测试:
public class User implements UserInterface1,UserInterface2 {
public String name;
private String password;
// public static int age =10;
public static void StaticMethod(String param){
System.out.println("静态方法参数"+param);
}
public User(String name){
this.name=name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package com.test.reflection;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Reflection {
public Object getProperty(Object obj,String name) throws Exception{
Class ClassObj=obj.getClass();
Field publicf = ClassObj.getField(name);
Object Property = publicf.get(obj);
return Property;
}
public Object getStaticProperty(String className, String fieldName) throws Exception{
Class ClassObj = Class.forName(className);
Field staticf= ClassObj.getField(fieldName);
Object Property = staticf.get(ClassObj);
return Property;
}
public void invokeMethod(Object obj,String methodName ,Object[] args) throws Exception{
Class ClassObj = obj.getClass();
Class[] Classargs = new Class[args.length];
for (int i = 0; i < args.length; i++) {
Classargs[i] = args[i].getClass();
}
Method method = ClassObj.getMethod(methodName, Classargs );
method.invoke(obj, args);
}
public void invokeStaticMethod(String className , String staticMethodName, Object[]args)
throws Exception{
Class ClassObj = Class.forName(className);
Class[] Classargs = new Class[args.length];
for (int i = 0; i < args.length; i++) {
Classargs[i] = args[i].getClass();
}
Method method = ClassObj.getMethod(staticMethodName, Classargs);
method.invoke(null, args);
}
public Object newInstance(String className,Object[]args ) throws Exception{
Class ClassObj = Class.forName(className);
Class[] Classargs = new Class[args.length];
for (int i = 0; i < args.length; i++) {
Classargs[i] = args[i].getClass();
}
Constructor constructor = ClassObj.getConstructor(Classargs);
Object obj = constructor.newInstance(args);
return obj;
}
public boolean isInstance(Class cla , Object obj){
return cla.isInstance(obj);
}
public Class[] getInterfaces(String ClassName ) throws Exception{
Class ClassObj = Class.forName(ClassName);
Class[] Is = ClassObj.getInterfaces();
for (int i = 0; i < Is.length; i++) {
System.out.println(Is[i].getName());
}
return Is;
}
public static void main(String[] args) throws Exception {
/*
Reflection reflection = new Reflection();
User user= new User();
user.setName("ysen");
Object object=reflection.getProperty(user, "name");
System.out.println(object);*/
/* Reflection reflection = new Reflection();
Object object=reflection.getStaticProperty("com.test.reflection.User", "age");
System.out.println(object); */
/* Reflection reflection = new Reflection();
User user= new User();
reflection.invokeMethod(user, "setName", new Object[]{"ysen"});
System.out.println(user.getName()); */
/* Reflection reflection = new Reflection();
User user= new User();
reflection.invokeStaticMethod("com.test.reflection.User", "StaticMethod", new Object[]{"ysen"});
*/
/* Reflection reflection = new Reflection();
User user = (User)reflection.newInstance("com.test.reflection.User", new Object[]{"ysen"});
System.out.println(user.getName());*/
/*Reflection reflection = new Reflection();
reflection.getInterfaces("com.test.reflection.User");
*/
/*
Class userClass = User.class;
Field[] userProperty= userClass.getFields();
for (Field field : userProperty) {
System.out.println(field.getName());
}*/
// 获取User自身定义的属性名称,不论 public 或private 或其它类型皆可获得
/*Class userClass = User.class;
Field[] userProperty= userClass.getDeclaredFields();
for (Field field : userProperty) {
System.out.println(field.getName());
}
*/
/* Class userClass = User.class;
Method[] userMethods= userClass.getDeclaredMethods();
for (Method m : userMethods) {
System.out.println(Modifier.toString(m.getModifiers())+" "+ m.getReturnType() +" "+ m.getName() +"()" );
}
*/
/*Class userClass = User.class;
Field[] userFields= userClass.getDeclaredFields();
User user= new User("");
for ( Field f : userFields) {
f.setAccessible(true);
f.set(user, "ysen");
//f.get(user);
System.out.println(f.getName()+f.isAccessible() );
System.out.println(user.getName());
}
*/
}
}