Java反射机制实例
Java反射机制实例
下面是Java常见的反射机制的实现。
/**
* 用于反射的类
*/
public class Role {
private String name = "默认的不带参数的构造函数";
private String type ="默认是public";
private static Role instance = null;
//不带参数的
public Role() {
}
//带参数的
public Role(String name) {
this.name = name;
}
//私有带参数的构造函数
private Role(String name,String type) {
this.name = name;
this.type = type;
}
private void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
@Override
public String toString() {
System.out.println(getName()+":"+getType());
return this.getName();
}
public synchronized static Role getInstance() {
if(instance == null) {
instance = new Role("带参数的","俺是private");
}
return instance;
}
public String getType() {
return type;
}
private void setType(String type) {
this.type = type;
}
}
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class RefletTest {
/**
* @param args
* @throws ClassNotFoundException
* @throws IllegalAccessException
* @throws InstantiationException
*/
public static void main(String[] args) throws ClassNotFoundException,
InstantiationException, IllegalAccessException {
// 反射例子1
System.out.println();
System.out.println("==========反射例子之1==========");
Class<Role> cls1 = Role.class;
// 只能反射默认的构造函数
Role role1 = cls1.newInstance();
role1.toString();
// 反射的例子2
System.out.println();
System.out.println("==========反射例子之2==========");
Class<Role> cls2 = (Class<Role>) Class.forName("nc.model.reflect.Role");
// 只能反射默认的构造函数
Role role2 = cls2.newInstance();
role2.toString();
// 反射的例子3 获取类的构造器
/**
* public Constructor<?>[] getConstructors()
* 返回类中所有的public构造器集合,默认构造器的下标为0 public Constructor<T>
* getConstructor(Class<?>... parameterTypes) 返回指定public构造器,参数为构造器参数类型集合
* public Constructor<?>[] getDeclaredConstructors() 返回类中所有的构造器,包括私有
* public Constructor<T> getDeclaredConstructor(Class<?>...
* parameterTypes) 返回任意指定的构造器
*/
System.out.println();
System.out.println("==========反射例子之3==========");
// 先看看public
try {
Constructor<Role> constructor1 = cls2
.getConstructor(new Class[] { String.class });
Role role3 = constructor1.newInstance("public型的带参数的");
role3.toString();
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
System.out.println();
System.out.println("==========反射例子之4==========");
Constructor<Role> constructor2;
Role role4 = null;
try {
constructor2 = cls2.getDeclaredConstructor(new Class[] { //只能使用getDecalredConstructor方法,而不能使用getConstructor
String.class, String.class });
constructor2.setAccessible(true);// 设置访问权限,私有时,必须设
role4 = constructor2.newInstance("带参数的", "private型的");
role4.toString();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException 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();
}
// 反射例子5 获取类的成员变量
/**
* 了解了构造器,其实你可以猜到成员变量的获取方法了,成员变量用Field类进行封装。 主要的方法非常的类似: public Field
* getDeclaredField(String name) 获取任意指定名字的成员 public Field[]
* getDeclaredFields() 获取所有的成员变量 public Field getField(String name)
* 获取任意public成员变量 public Field[] getFields() 获取所有的public成员变量
*/
try {
Field field1 = cls2.getDeclaredField("type");// 参数是字段名
field1.setAccessible(true);
Object object1 = field1.get(role2);// 参数是实例化的类
Object object2 = field1.get(role4);// 参数是实例化的类
System.out.println("=========反射例子之5===========");
System.out.println(object1);
System.out.println(object2);
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 反射例子6 方法 --方法
/**
* public Method[] getMethods() 获取所有的公有方法的集合 public Method
* getMethod(String name,Class<?>... parameterTypes) 获取指定公有方法 参数1:方法名
* 参数2:参数类型集合 public Method[] getDeclaredMethods() 获取所有的方法 public Method
* getDeclaredMethod(String name,Class<?>... parameterTypes) 获取任意指定方法
* 无参的时候我们只要传null就行了。
*/
try {
Method method1 = cls2.getDeclaredMethod("setName",
new Class[] { String.class });
method1.setAccessible(true);
method1.invoke(role2, "私有的我也可以用");
Method method2 = cls2.getMethod("getName", null);
Object invoke = method2.invoke(role2, null);//非静态方法第一个参数 不能为空
System.out.println("==========反射例子之6==========");
System.out.println(invoke);
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}// 无参的时候我们只要传null就行了。
catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 反射例子7 方法 --静态方法和字段,
Method method3;
try {
method3 = cls2.getDeclaredMethod("getInstance",
null);
method3.setAccessible(true);
Object invoke = method3.invoke(null, null);//记住与普通方法不同,第一个参数是null(不过貌似不为空,好像也没事)
if(invoke instanceof Role) {
System.out.println("实例化成功");
}
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException 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();
}
//内部类神马的 ---后续加上
}
}
大话设计模式(带目录完整版) PDF+源代码
Java中介者设计模式
Java 设计模式之模板方法开发中应用
设计模式之 Java 中的单例模式(Singleton)
本文永久更新链接地址:
评论暂时关闭