java反射的基本概念
反射非常非常重要的一点是可以将方法的名称和参数,以变量的形式传递,比如从网页上读,从数据库读,从文件里读,传什么方法名我就可以动态的调用方法,这就是反射的好处,但是反射会让运行速度降低。
但是我们可以通过setAccessible方法来关闭安全检查,以提高一些效率。关闭安全检查之后,无视类中所有成员的权限修饰符,都当作public来处理。
在学习完反射之后在学习框架会容易理解很多,你会在框架中见到大量用反射来创造对象的代码。
一般代码:启用安全检查的反射代码:关闭安全检查的代码
他们的运行速度比大约是1:30:8
下面的代码是Class的一些基本操作
package reflection;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Test {
@SuppressWarnings("all")
public static void main(String[] args) {
try {
Class<STudents> clazz = (Class<STudents>)Class.forName("reflection.STudents");
/* 通过Class对象来查看类内部的所有信息*/
/*Field f= clazz.getDeclaredField("sex");//获取类属性
Method m = clazz.getMethod("setNum",int.class);//获取类的所有public方法
Constructor c = clazz.getConstructor(int.class,String.class,boolean.class);
//获取类得所有public构造器
System.out.println(c);*/
/*调用该类的无参构造来创造对象*/
/* STudents s1 = clazz.newInstance();
System.out.println(s1);*/
/*调用该类的有参构造器来创造对象*/
/*Constructor f = clazz.getDeclaredConstructor(int.class,String.class,boolean.class);
* //获取有参构造器
STudents s1= (STudents) f.newInstance(5,"张三",false); //用有参构造器创造对象 返回 该类的实例
System.out.println(s1.getName());//输出该实例的名字*/
/*通过反射API来调用普通方法 */
/*clazz.newInstance().setNum(4); 这不是通过反射调用*/
//首先通过Class对象来获取到该类的成员方法
/*STudents s =clazz.newInstance();
Method m = clazz.getDeclaredMethod("setName", String.class);//获得该类setName方法
m.invoke(s,"lisi");
System.out.println(s.getName());*/
/*重点:通过上述的例子 可以看出 方法名称和参数都变成了变量 ,
这样我们就可以将方法名和对象变成参数 从外界传递进来 ,这就是反射的好处*/
/*通过反射API调用成员变量*/
/*STudents s4 = clazz.newInstance();
Field f = clazz.getDeclaredField("num");
f.setAccessible(true);//可以跳过私有检查 直接赋值 ,私有方法也用这个方法,并不是false时就不能访问
f.set(s4, 2);//因为属性是私有的 所以直接赋值会报错 1
System.out.println(s4.getNum());*/
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
`