您的位置:首页 > 职场人生

黑马程序员——Java基础--反射

2015-08-16 22:00 399 查看
-------
android培训、java培训、期待与您交流! ----------

一  加载器

       类的加载:当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化。

       类加载器负责将.class文件加载到内在中,并为之生成对应的Class对象。

类加载器的组成:

Bootstrap ClassLoader 根类加载器,负责Java核心类的加载;

Extension ClassLoader 扩展类加载器,负责JRE的扩展目录中jar包的加载;

System ClassLoader 系统类加载器,负责在JVM启动时加载来自java命令的class文件,以及classpath环境变量所指定的jar包和类路径。

二  反射

       Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

创建一个Person类:public class Person {
public String name;
public int age;
public Person(){
System.out.println("空参构造方法");
}
public Person(String name,int age){
this.age = age;
this.name = name;
System.out.println("2个参数的构造方法");
}
private Person(String name){
this.name = name;
System.out.println("私有构造方法");
}
public void show(){
System.out.println("show方法");
}
public void function(String name,double d){
System.out.println(name+"..."+d);
}
public String toString(){
return "Person "+name+" "+age;
}
}
        获取一个类的class文件对象的三种方式:

第一种:类的对象获取,对象调用方法getClass()获取

第二种:类的静态属性获取,静态属性.class获取

第三种:使用Class类静态方法forName获取

public class ReflectDemo {
public static void main(String[] args)throws Exception {
Person p = new Person();
//通过父类方法getClass获取
Class c1 = p.getClass();
System.out.println(c1);
//通过类的静态属性class获取
Class c2 = Person.class;
System.out.println(c2);
//使用Class类的静态方法forName获取,全类名
Class c3 = Class.forName("reflect.Person");
System.out.println(c3);
}
}
       通过反射获取构造方法:

public class ReflectDemo2 {
public static void main(String[] args)throws Exception {
//获取class文件对象
Class c = Class.forName("cn.itcast.reflect.Person");
//通过Class类的方法getConstructor获取指定构造方法
Constructor con = c.getConstructor(String.class,int.class);
//使用Constructor类的方法newInstance()运行构造方法
Object obj = con.newInstance("haha",30);
System.out.println(obj);
}
}
       通过反射获取成员变量:

public class ReflectDemo5 {
public static void main(String[] args) throws Exception{
Class c = Class.forName("cn.itcast.reflect.Person");
Object obj = c.newInstance();
//调用Class类的方法getField(变量名)获取指定成员变量,公共权限
Field field = c.getField("name");
//调用Field类的方法set修改成员变量值
field.set(obj, "lisi");
System.out.println(obj);
}
}
       通过反射获取成员方法:

public class ReflectDemo7 {
public static void main(String[] args) throws Exception{
Class c = Class.forName("cn.itcast.reflect.Person");
Object obj = c.newInstance();
//Class类的方法getMethod获取指定的方法function,参数是字符串,double
Method method = c.getMethod("function", String.class,double.class);
method.invoke(obj, "调用方法",0.01);
}
}
       暴力反射:

       私有方法不能直接访问,因为权限不够。非要访问,可以通过暴力的方式。 方法:method.setAccessible(true);一般很少用,因为私有就是隐藏起来,所以尽量不要访问。 

import java.lang.reflect.*;
class ReflectPoint {
private int priVar;
public ReflectPoint(int priVar){
this.priVar =priVar;
}
}
public class Demo {
public static void main(String[] args) throws Exception {
ReflectPoint pt1 = new ReflectPoint(3);
Field fieldx = pt1.getClass().getDeclaredField("priVar");
fieldx.setAccessible(true);
fieldx.set(pt1, 100);
System.out.println(fieldx.get(pt1));
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: