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

黑马程序员-java基础-反射

2015-07-02 22:16 555 查看
----<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! ----

反射:
    程序运行期间,JVM会对类创建字节码文件对象,利用这个文件对象,对这个class文件

    进行解剖,直接获取成员,调用这些成员

    这种动态的获取一个类中的信息,反射技术

 
  实现反射技术,对class解剖,必须获取到这个类的class文件对象:

    package cn.itcast.reflect;

/*

 * 获取一个类进入内存后的 class文件的对象

 * class文件对象的描述类 lang.Class

 * 获取方式三种

 *   1. 直接通过类的对象获取

 *     调用方法 getClass()获取

 *     

 *   2. 类名.class属性获取

 *   

 *   3. Class类的静态方法forName()获取

 *   选择第三种,灵活多变,类名是一个字符串,可以参数传递

 *   字符串读取文件获得

 */

public class ReflectDemo {
public static void main(String[] args)throws Exception {
//1 类的对象获取
Person p = new Person();
//调用方法getClass获取 Person.class文件对象
Class c1 = p.getClass();
System.out.println(c1);

//2 类的静态成员class获取,
Class c2 = Person.class;
System.out.println(c2);
System.out.println(c1==c2);
System.out.println(c1.equals(c2));

//3 Class类的静态方法forName("字符串格式的类名")
//类名.必须全类名  包名.类名
Class c3 = Class.forName("cn.itcast.reflect.Person");
System.out.println(c3);
}

}

  此类提供方法,直接运行解剖后类的方法:

 
  Class类中的方法,获取一个字节码文件对象中的构造器

  Constructor[] getConstructors() 获取字节码文件中的构造方法,所有公共权限

  返回值是描述构造方法对象的类  Constructor 存储的是数组

  Constructor getConstructor(Class... p)获取指定构造方法,一个,根据构造方法的参数列表定

  Constructor类有一个方法,可以运行获取到的构造器

  Object newInstance(Object...o)

 
 Class类中的方法 获取私有构造器:

  Constructor[] getDeclaredConstructors()获取所有构造方法,包括私有 

  Constructor getDeclaredConstructor()获取指定的构造方法

package cn.itcast.reflect;

/*

 * 反射Person类,获取构造方法,并运行

 */

import java.lang.reflect.*;

public class ReflectDemo1 {
public static void main(String[] args)throws Exception {
Class clazz = Class.forName("cn.itcast.reflect.Person");
//Class类的方法  getConstructors() 返回的是数组
/*Constructor[] cons = clazz.getConstructors();
for(Constructor c : cons){
System.out.println(c);
}*/

//获取指定,空参数的构造方法,运行
Constructor con = clazz.getConstructor();
System.out.println(con);
//运行获取到的构造方法 Constructor类的方法 newInstance
Object obj = con.newInstance();
System.out.println(obj);

}

}

  package cn.itcast.reflect;

/*

 * 反射Person类,获取有参数构造方法

 *  String int

 */

import java.lang.reflect.*;

public class ReflectDemo2 {
public static void main(String[] args) throws Exception{
Class clazz = Class.forName("cn.itcast.reflect.Person");
//Class类的方法getConstructor获取有参数构造器
//传递的参数是Class类型
Constructor con = clazz.getConstructor(String.class,int.class);
//使用Constructor类方法newInstance运行构造器,传递实际参数
Object obj = con.newInstance("张三",29);
System.out.println(obj);
}

}

package cn.itcast.reflect;

/*

 * 反射Person,获取构造方法并运行,简单方式

 * 前提要求:

 *   被反射的类中,必须有空参数构造方法,而且是public权限

 */

import java.lang.reflect.*;

public class ReflectDemo3 {
public static void main(String[] args)throws Exception {
Class clazz = Class.forName("cn.itcast.reflect.Person");
//Class中,有一个方法,可以直接运行空参数构造器,最大权限
//newInstance()默认运行被反射的类中的,public权限空参数构造
Object obj = clazz.newInstance();
System.out.println(obj);
}
}

package cn.itcast.reflect;

/*

 * 获取私有构造方法,并运行

 * 暴力访问

 *  

 */

import java.lang.reflect.*;

public class ReflectDemo4 {
public static void main(String[] args) throws Exception{
Class clazz = Class.forName("cn.itcast.reflect.Person");
/*Constructor[] cons = clazz.getDeclaredConstructors();
for(Constructor c : cons){
System.out.println(c);
}*/

//获取私有构造方法 int参数
Constructor con = clazz.getDeclaredConstructor(int.class);
//调用Constructor父类(AccessibleObject)方法 setAccessible(true)
//setAccessible反射的时候,取消访问检查
con.setAccessible(true);
Object obj = con.newInstance(331);
System.out.println(obj);
}

}

 Class类中的方法,获取成员变量方法:

  Field[]  getFields()获取类中的成员变量,公共权限

  Field    getField(字符串的变量名) 获取指定成员变量 ,公共权限

  Field    getDeclaredField(字符串的变量名) 获取指定成员变量,包含私有

  修改成员变量的值,用的是Field类的方法 set(对象,修改后的值)

package cn.itcast.reflect;

import java.lang.reflect.Field;

/*

 * 反射 Person.获取成员变量修改值

 */

public class ReflectDemo5 {
public static void main(String[] args) throws Exception{
Class clazz = Class.forName("cn.itcast.reflect.Person");
/*Field[] fields = clazz.getFields();
for(Field f : fields){
System.out.println(f);
}*/
Object obj = clazz.newInstance();
Field field = clazz.getField("name");
System.out.println(field);
//Field类修改成员变量
// void set(Object obj, Object value) 
field.set(obj, "哈哈");
System.out.println(obj);
 
}

}

    
 Class类中的方法,获取成员方法:

   Method[] getMethods() 类中的成员方法,公共权限,继承的方法

   Method   getMethod(字符串的方法名,方法参数)获取类中指定的一个方法,方法名和参数列表

   Method类中,有一个方法invoke() 运行获取到的方法

   Object invoke(Object obj,Object...o)

    第一个参数对象,调用方法传递的实际参数

package cn.itcast.reflect;

/*

 * 反射Person,获取成员方法,并运行

 */

import java.lang.reflect.*;

public class ReflectDemo6 {
public static void main(String[] args)throws Exception {
Class clazz = Class.forName("cn.itcast.reflect.Person");
//调用Class类的方法getMethods获取类中成员方法
/*Method[] methods = clazz.getMethods();
for(Method m : methods){
System.out.println(m);
}*/
Object obj = clazz.newInstance();
//获取类中的eat方法,无参数
Method method = clazz.getMethod("eat");
//运行方法 Method类的方法invoke
method.invoke(obj);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  反射