A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

6黑马币

最佳答案

查看完整内容

反射:在运行状态下,通过class文件对象,去使用构造方法,成员变量,成员方法 方法有三种: 1.类名.class 2.对象.getclass() 3.class.forName("包名.类名") 好处: 只要有一个类或者一个类的对象,就可以得到这个类或对象的所有属性和方法,包括私有的 同步方法 反射成员方法: 1.获取字节码文件 Class c = Class.forName("包名.类名"); 2.反射方法 Method m = c.getMethod("反射的方法",方法的参数类型.class); ...

8 个回复

倒序浏览
反射:在运行状态下,通过class文件对象,去使用构造方法,成员变量,成员方法
        方法有三种:
                1.类名.class
                2.对象.getclass()
                3.class.forName("包名.类名")
        好处:
           只要有一个类或者一个类的对象,就可以得到这个类或对象的所有属性和方法,包括私有的
         同步方法

反射成员方法:
1.获取字节码文件
                Class c = Class.forName("包名.类名");
2.反射方法
                Method m = c.getMethod("反射的方法",方法的参数类型.class);
  3.用方法,m.invoke(对象,参数)   对象,c.newInstance ,在A建立对象。
                m.invoke(c.newInstance(),参数);

类加载器与反射有什么关系
反射是通过字节码文件对象,将类的字段,方法,构造器等映射成相应的类,并进行各自的操作;
类加载器是通过某个类的.classLoader()方法,将该类的.class文件从硬盘中加载到java虚拟机中,形成字节码文件;

什么是字节码文件?
代码完成后,通过javac编译后形成.class文件,然后类加载器将.class文件从硬盘加载到java虚拟机中,形成字节码文件
回复 使用道具 举报
一.反射:
        1.获取类的Class对象的三种方式:
                1).Object-->getClass()方法;
                2).任何类型都有一个class静态属性;
                3).Class类的静态方法forName(String className);(常用)
        2.通过Class对象获取构造方法、成员变量、成员方法:
                1).构造方法:
                   ---批量的;
*                         Constructor[] getConstructors():获取所有的"公有"构造方法;
                        Constructor[] getDeclaredConstructors()::获取所有的(包括私有的)构造方法;
               
                        每一个Constructor内部都包含了"一个构造方法"的详细信息;
               
                   ---单个的
                        public Constructor getConstructor(Class ... parameterTypes):获取某个公有的构造方法
                        public Constructor getDeclaredConstructor(Class<?>... parameterTypes):获取某个构造方法(包括私有的)
                   ---实例化对象:
                        1).Class--->newInstance();
                        2).Constructor-->newInstance();
                   ---设置暴力访问:
                        setAccessible(true);
                2).成员属性:
                   ------批量的:
                          Field[] getFields():获取所有公有的成员变量
                        Field[] getDeclaredFields():获取所有成员变量(包括私有)
                      ----单个的:
                           Field getField():获取单个,公有的成员变量
                           Field getDeclaredField():获取单个的成员变量,包括私有的
                      ----为成员变量赋值:
                           Filed --> set(Object obj,Object value)
                3).成员方法:
                   ----批量的:
                        Method[] getMethods():获取所有公有的成员方法;
                        Method[] getDeclaredMethods():获取所有的成员方法包括私有的。
                   ----单个:
                        Method getMethod():获取单个公有的成员方法;
                        Method getDeclaredMethod():获取单个成员方法,包括私有的;
                   ----调用方法:
                        Method --> public Object invoke(Object obj,Object... args)
二.设计模式:
        1.代理模式:
                --动态代理:
                        1.定义一个类,实现:InvocationHandler
                        2.在使用时,使用Proxy:newProxyInstance()方法产生代理对象;
        2.模板模式:
        3.装饰模式:
三.JDK5的新特性:
        1.自动装箱和拆箱
        2.泛型
        3.增强for循环
        4.静态导入
        5.可变参数
        6.枚举

四.JDK7的新特性:
        1.二进制字面量
        2.数字字面量可以出现下划线
        3.switch 语句可以用字符串
        4.泛型简化
        5.异常的多个catch合并
        6.try-with-resources 语句

五.JDK8的新特性:
        1.接口可以有方法了。
回复 使用道具 举报
反射定义:
在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取信息以及动态调用对象的方法的功能称为java语言的反射机制。
反射,加载类的字节码的三种方式:://blog.sina.com.cn/s/blog_4ccc67550102v13r.html
反射的好处:
1、反射提高了程序的扩展性
2、配置文件和接口的方式是编程更加简单。
以TomCat服务器为例:
TomCat对外提供了一个Servlet接口,定义了处理请求和应答的方式。
以及一个web.xml配置文件,用户可以自定义MyServlet类实现Servlet接口
将类名添加到web.xml配置文件中,服务器可以根据类名获取class文件,
具体:http://m.blog.csdn.net/blog/ladooz/8466764
回复 使用道具 举报
Java反射机制主要提供了以下功能:
在运行时判断任意一个对象所属的类;

在运行时构造任意一个类的对象;

在运行时判断任意一个类所具有的成员变量和方法;

在运行时调用任意一个对象的方法;

生成动态代理。
反射的好处:
1、反射提高了程序的扩展性
2、配置文件和接口的方式是编程更加简单。
以TomCat服务器为例:
TomCat对外提供了一个Servlet接口,定义了处理请求和应答的方式。
以及一个web.xml配置文件,用户可以自定义MyServlet类实现Servlet接口
将类名添加到web.xml配置文件中,服务器可以根据类名获取class文件,
回复 使用道具 举报
获取字节码文件Class对象,就成为了反射的第一步。
方式一:
       通过对象的Class getClass()方法。
       对于扩展性,这种并不好,因为需要使用该类,并还需要创建该类的对象。
       通过对象的getClass方法才可以获取到字节码文件对象。
       方式二:
       任何一个数据类型,都对应的一个描述,都可以获取其对应的Class对象。而且是通过数据类型的一个静态属性完成,该属性就是class.
       这种方式比第一种写法上更为简单。但是还是不利于扩展,因为还要用到Person类。
        方式三:
        通过Class类中的forName方法。根据指定字符串名称,就可以获取该名称对应的字节码文件的对象。
       该方式扩展性非常好,只需给定类的字符串名称即可获取Class对象。
获取字节码文件的目的是什么?
是为了创建该字节码文件对象。然后再通过对象去调用对象中的方法。
现在已经可以通过forName方法获取class对象了。
回复 使用道具 举报

优点:反射提高了程序的灵活性和扩展性,降低耦合性,提高自适应能力。
它允许程序创建和控制任何类的对象,无需提前硬编码目标类;
缺点:(1)性能问题:使用反射基本上是一种解释操作,用于字段和方法接入时要远慢于直接代码。
因此反射机制主要应用在对灵活性和扩展性要求很高的系统框架上,普通程序不建议使用。
(2)使用反射会模糊程序内内部逻辑:
程序员希望在源代码中看到程序的逻辑,反射等绕过了源代码的技术,因而会带来维护问题。
反射代码比相应的直接代码更复杂。
回复 使用道具 举报
1:反射(理解)
        (1)类的加载及类加载器
        (2)反射:
                通过字节码文件对象,去使用成员变量,构造方法,成员方法
        (3)反射的使用
                A:通过反射获取构造方法并使用
                B:通过反射获取成员变量并使用
                C:通过反射获取成员方法并使用
        (4)反射案例
                A:通过反射运行配置文件的内容
                B:通过反射越过泛型检查
                C:通过反射给任意的一个对象的任意的属性赋值为指定的值
        (5)动态代理
       
2:设计模式
        (1)装饰设计模式
                BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
               
                Scanner sc = new Scanner(System.in);
        (2)模版设计模式
回复 使用道具 举报
归纳的很到位。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马