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

----<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);
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值