简单的来说,反射机制指的是程序在运行时能够获取自身的信息。在java中,只要给定类的名字, 那么就可以通过反射机制来获得类的所有信息。
public class Reflection {
Reflection(){
}
public Reflection(String firstname){
System.out.println("有一个参数构造");
}
public Reflection(String firstName,String lastName ){
System.out.println("有多个参数构造");
}
private Reflection(String lastName,String firstName,String name){
System.out.println("私密的构造");
}
protected Reflection(String asName,String lastName,String firstName,String name){
System.out.println("保护的构造");
}
public void sayHello() {
System.out.println("Hello,Murphy !");
}
public static void sayHi() {
System.out.println("Hi,Murphy !");
}
private void sayBye() {
System.out.println("Oh,I'll better go,catch you later");
}
public static void main(String[] args) {
System.out.println("See you !");
}
}
public class ReflectionAction {
public static void main(String[] args) throws Exception {
try {
Class cla = Class.forName("demo.Reflection");//package全称
Constructor[] conArray = cla.getConstructors();//获取所有公开的构造方法
for(Constructor c : conArray) {
System.out.println(c);
}
conArray = cla.getDeclaredConstructors();//获取所有构造方法
for(Constructor c : conArray) {
System.out.println(c);
}
//获取公有无参构造方法
//Constructor con = cla.getConstructor();
//获取私有构造方法
Constructor con = cla.getDeclaredConstructor();
con.setAccessible(true);//暴力访问(忽略掉访问修饰符)
Object obj = con.newInstance();//调用方法
//获取成员变量
// cla.getDeclaredField("name");//可以得到这个类所有成员变量包括private 但不能得到父类的 这里只能获取字段并不能访问值
// cla.getField("name");//只能得到public 可以得到父类的
//获取方法
/**
*调用 公开的方法
*/
Method m = cla.getMethod("sayHi");
m.invoke(cla.newInstance());
Reflection h =new Reflection();
h.sayHello(); //传统调用
/**
* 调用私有方法
*/
m = cla.getDeclaredMethod("sayBye");
m.setAccessible(true);
m.invoke(cla.newInstance());
/**
* main方法
*/
Method methodMain = cla.getMethod("main", String[].class);
methodMain.invoke(null, (Object)new String[]{"a","b","c"});//方式一
// methodMain.invoke(null, new Object[]{new String[]{"a","b","c"}});//方式二
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}