什么是Java 反射(reflect)
Java反射是Java被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时透过Reflection API取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public, static 等)、superclass(例如Object)、实现之interfaces(例如Cloneable),也包括fields和methods的所有信息,并可于运行时改变fields内容或唤起methods。
Java反射机制允许程序在运行时加载、探知、使用编译期间完全未知的classes。
换言之,Java可以加载一个运行时才得知名称的class,获得其完整结构
如果实现类的Reflect 呢?
通过类的Class 对象。 运行时类想引入其他类对象 这时就要使用类的Class对象。如何获取类的Class对象呢? 有四种方法,常用的三种
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
Class c;
try {
// 获取类的Class对象有三种方式 其实也就是获取Reflect
// 第一种方式 使用静态方法 forName
c = Class.forName("User");
// 第二种方法
// c = User.class;
//第三种方法
// User user = new User();
// c = user.getClass();
Object obj = c.newInstance();
Method m1=c.getMethod("say");//找到名字叫做say、且无参的方法
Method m2=c.getMethod("say",String.class);//找到名字叫做say、且有一个String类型参数的方法
Method m3=c.getMethod("setName",String.class);
Method m4=c.getMethod("getName");
m3.invoke(obj, "zlm");
m4.invoke(obj);
m1.invoke(obj);//注意newInstance()调用的是无参的构造方法!!!
m2.invoke(c.getConstructor(String.class).newInstance("zlm"),"哈哈");//通过有参的构造方法实例化一个对象
System.out.println("-----------------------------------获取Reflect属性-------------------------");
// c.getField("name");
Object object = c.newInstance(); // 这是本例的事例对象
c.getField("pas").set(object, "zlmwin");
Field field = c.getDeclaredField("name");
field.setAccessible(true);
field.set(object, "win0701");
System.out.println(field.get(object));
System.out.println(c.getField("pas"));
System.out.println(c.getField("pas").get(object));
Field[] field1 = c.getFields();
for(Field fi:field1){
System.out.println("============fi========>" + fi);
}
Field[] field2 = c.getDeclaredFields();
for(Field fe:field2){
System.out.println("-=-=-=-=-=-=fe-=-=-=-=-=<>" + fe);
System.out.println("-------------------赋值开始----------------" + fe.toString().trim().startsWith("public", 0));
if(fe.toString().startsWith("public", 0)){
System.out.println("99999999999999");
fe.set(object, "public");
System.out.println(fe.get(object));
}else{
fe.setAccessible(true);
fe.set(object, "private");
System.out.println(fe.get(object));
}
System.out.println("-------------------赋值结束----------------");
System.out.println("==================================Field测试结束====================");
System.out.println("==================================方法 test start====================");
// //Method me = c.getMethod("info");
// //Method me = c.getMethod("login", String.class);
// Method me = c.getDeclaredMethod("login", String.class);
// me.setAccessible(true);
// me.invoke(object, "小丁");
// System.out.println("-----------------------------");
// Method[] me1 = c.getMethods();
// for(Method mh:me1){
// System.out.println("---???--->" + mh + "----" + mh.hashCode());
//
// }
// Method method = c.getMethod("getName");
// method.invoke(object);
}
System.out.println("----------------构造方法----------------------");
Constructor con = c.getConstructor(String.class);
c.newInstance();
User user= (User)con.newInstance("小丁丁");
user.say();
user.say("liming");
System.out.println("ppppppp......" + con);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}//通过反射找到对应的类
}
}
User 类
class User
{
private String name;
public String pas;
public static String id;
public void setName(String name){
this.name = name;
System.out.println("-----------"+this.name);
}
public String getName(){
System.out.println("---+--------"+this.name);
return this.name;
}
public User(){
System.out.println("无参构造方法");
}
public User(String name)
{
System.out.println("----------------============" + name);
this.name=name;
}
public void say()//无参的方法
{
System.out.println("大家好,我叫"+this.name+"!");
}
public void say(String str)//有参的方法
{
System.out.println("大家好,我叫"+name+"!"+str+",我是有参的方法!");
}
@SuppressWarnings("unused")
private void login(String name){
this.name = name;
System.out.println("私有方法---------------->" + name);
}
public static void info(){
System.out.println("静态方法");
}
}
转载于:https://blog.51cto.com/verify/1562270