黑马程序员-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);
}
}
反射:
程序运行期间,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);
}
}
相关文章推荐
- Java反射随记
- AS3中的反射(速记) 分析
- C# 反射(Reflection)的用处分析
- C#通过反射创建自定义泛型
- 通俗易懂的C#之反射教程
- C#根据反射和特性实现ORM映射实例分析
- 深入反射生成数组的详解
- C#利用反射来判断对象是否包含某个属性的实现方法
- C#泛型和反射实例解析
- C# Dynamic关键字之:dynamic为什么比反射快的详解
- 传智播客学习之java 反射
- Java 反射之私有字段和方法详细介绍
- php使用反射插入对象示例分享
- java反射使用示例分享
- java利用反射实现动态代理示例
- 用户控件(ASCX)向网页(ASPX)传值使用反射实现
- 基于Java回顾之反射的使用分析
- c#反射调用方法示例
- C#中使用反射获取结构体实例及思路
- JavaScript对象反射用法实例