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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 厦门校区   /  2018-5-12 15:02  /  11578 人查看  /  97 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

任佳锋

JAVA反射机制
是指程序运行过程时,通过字节码对象与方法的配合,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;

三种字节码对象的获取方式
通过类名直接获取字节码对象   譬如Student.class
创建对象 ,通过对象调用getclass方法获取
通过Class类直接调用forname方法传入全类名参数获取

反射获取构造方法的两种方式
通过字节码对象调用 getconstrucotor 方法在括号内传入参数类型.class获取有参构造方法
                Constructor con = clazz.getConstructor(String.class, int.class);
再通过newInstance创建对象并传入参数;
                Object obj = con.newInstance("老陈", 47);
获取空参构造方法
                Constructor cstr = clazz.getConstructor();
通过newInstance创建对象;
                Object ni = cstr.newInstance();

其次   反射获取成员变量(字段)与成员方法的方法大致分为两种:
  一种是获取public修饰的也就是公共的成员变量(字段)与方法:
Field[] getFields() 获取所有公共的成员变量(字段)  返回对象数组
Field getField(String name) 获取指定的成员变量(字段) 返回成员变量(字段)的对象
获取public成员方法:
Method getMethod(String name,(方法名) Class<?>... parameterTypes(当方法需要传入参数时此处填写传入参数的类型.class))  
Object invoke(Object obj, Object... args)  获取之后通过此方法执行获取的成员方法
二种是获取私有的成员变量(字段)与方法:
Field[] getDeclaredFields()   获取所有的成员变量 包含私有
Field getDeclaredField(String name)   获取指定的成员变量 包含私有
注意,此时只是获取,若是需要为成员变量赋值或修改其值这需要调用setAccessible(true)方法躲过jvm的检测,暴力访问
Method m = clazz.getDeclaredMethod("setName", String.class)  获取私有成员方法
若需要执行该方法时,则需要同上调用setAccessible(true)方可执行程序;

BeanUtils 感觉跟平常的类差不多= =同样是用来封装数据的
主要有三种方法
static void        setProperty(Object bean, String name, Object value)   给JavaBean对象的成员变量进行赋值
static String getProperty(Object bean, String name)   获取JavaBean对象的成员变量的值
static void        populate(Object bean, Map properties)    给JavaBean对象的成员变量进行赋值

说实在的, 学了写了这么多.能记住一半我都很高兴了
憋了一个晚上才做了两道作业题,还不是很理解熟练.
有够打击的,
培优班见吧...
回复 使用道具 举报
侯玉林

今天我们学习了反射
1.什么是反射?
所谓反射就是在程序运行时,不需要new对象就能够获取该类的构造方法及其成员的一种机制.
2.我们为什么需要反射,或者说反射存在的意义是什么?
在程序后期更新开发中,由于市场更新需要,所以程序需要添加新的功能模块,但在原有代码上更新或者修改代码是灾难性的事件,在程序中各种类的关系错综复杂,牵一发而动全身,这种事别说是新程序员就是老程序员也犯怵.所以为了提高程序后期的可维护性和可扩展性,Sun公司提供了一套完整的反射机制,通过反射机制你无需去声明一个类,就可以使用其中的功能.
3.反射实现的原理是什么?
        (1)当程序运行时,虚拟机先将xxx.class文件加载到方法区中.
        (2)此时虚拟机中会有一个类的加载器,将方法区中的xxx.class文件生成一个xxx.class文件对象,俗称字节码对象.(对象类型:Class,位于java.lang包下.)
        扩展:由于xxx.class文件只有有一个且只加载一次,所以其生成的字节码对象也只有一个,因此无论你new都是个对象,所有对象的字节码都相同.
        (3)反射能够将xxx.class文件对象解剖,进而获取内部的工作方法和成员,这就是所谓的暴力反射.
4.反射的使用流程
反射的正常使用流程是,先用getxxx方法获取xxx.class文件对象中的构造方法和成员,然后在使用.

       
回复 使用道具 举报
5月12日   反射

施炎生

1.反射是在运行状态中,对于任何类,都能够得到它的成员(变量,方法)。
2.获取字节码对象三种方式。
3.获取无参构造方法:(1)获取字节码对象:Class clazz = Class.forName(“包名.类名);
                                (2)Constructor c=clazz.getConstructor();
4.获取有参构造方法:(1)获取字节码对象:Class clazz = Class.forName(“包名.类名);
                                 (2)Constructor c=clazz.getConstructor(参数类型.class;比如String.class,int.class);
5.获取public成员变量:(1)获取字节码对象:Class clazz = Class.forName(“包名.Student);
                                   (2)创建该类对象:Object stu=clazz.newInstance();
                                     (3)获取该类需要操作的字段(成员变量)Field f=clazz.getFiled("age");
                                      (4). 通过字段对象中的方法修改属性值
                                        f.set(stu,28);
                                       Object age=f.get(stu);
6.获取私有成员变量:在public成员变量的基础上,使用暴力获取,并调用字段对象的方法取消访问检查,暴力访问私有成员变量。
7.获取普通成员方法:(1)获取字节码对象:Class clazz = Class.forName(“包名.Student);
                                    (2)获取类的对象:Object stu = clazz.newInstance();
                                   (3)//获取无参无返回值的方法:
                                        Method m1 = clazz.getMethod("show1");
                                        m1.invoke(p);
                                         // 无参有返回值
                                         Method m2 = clazz.getMethod("show2");
                                        Object obj = m2.invoke(p);
                                       System.out.println(obj);
                                           // 有参无返回值
                                        Method m3 = clazz.getMethod("show3", String.class, int.class);
                                        m3.invoke(p, "张三", 10);
                                       // 有参有返回值
                                        Method m4 = clazz.getMethod("show4", String.class);
                                       Object obj2 = m4.invoke(p, "李四");
                                      System.out.println(obj2);
8.获取私有成员方法:在public成员变量的基础上,使用暴力获取,并调用 method.setAccessible(true)取消访问检查,暴力访问。
9.BeanUtils的常用方法
static void    setProperty(Object bean, String name, Object value)  用来给对象中的属性赋值(了解)
参数1: 需要设置属性的对象   参数2: 需要修改的属性名称    参数3: 需要修改的具体元素
static String getProperty(Object bean, String name) 用来获取对象中的属性(了解)
参数1: 要获取的javaBean对象    参数2: 对象中的哪个属性
static void    populate(Object bean, Map properties) 用来给对象中的属性赋值(掌握)
参数1: 要设置属性的对象     参数2: 将属性以Map集合的形式传入(Key : 属性的名称;Value:  属性具体的值)
     

回复 使用道具 举报
5月12日   反射
施炎生
1.反射是在运行状态中,对于任何类,都能够得到它的成员(变量,方法)。
2.获取字节码对象三种方式。
3.获取无参构造方法:(1)获取字节码对象:Class clazz = Class.forName(“包名.类名);
                   (2)Constructor c=clazz.getConstructor();
4.获取有参构造方法:(1)获取字节码对象:Class clazz = Class.forName(“包名.类名);
                   (2))Constructor c=clazz.getConstructor(参数类型.class;比如String.class,int.class);
5.获取public成员变量:(1)获取字节码对象:Class clazz = Class.forName(“包名.Student);
                         (2)创建该类对象:Object stu=clazz.newInstance();
                      (3)获取该类需要操作的字段(成员变量)
                        Field f=clazz.getFiled("age");
                                          (4). 通过字段对象中的方法修改属性值
                                                f.set(stu,28);
                                                Object age=f.get(stu);
6.获取私有成员变量:在public成员变量的基础上,使用暴力获取,并调用字段对象的方法取消访问检查,暴力访问私有成员变量。
7.获取普通成员方法:(1)获取字节码对象:Class clazz = Class.forName(“包名.Student);
                     (2)获取类的对象:Object stu = clazz.newInstance();
                    (3)//获取无参无返回值的方法:
                                 Method m1 = clazz.getMethod("show1");
                                 m1.invoke(p);
                                // 无参有返回值
                                   Method m2 = clazz.getMethod("show2");
                                Object obj = m2.invoke(p);
                                                System.out.println(obj);
                                                // 有参无返回值
                                                Method m3 = clazz.getMethod("show3", String.class, int.class);
                                                m3.invoke(p, "张三", 10);
                                                // 有参有返回值
                                                Method m4 = clazz.getMethod("show4", String.class);
                                                Object obj2 = m4.invoke(p, "李四");
                                                System.out.println(obj2);
8.获取私有成员方法:在public成员变量的基础上,使用暴力获取,并调用        method.setAccessible(true)取消访问检查,暴力访问。
9.BeanUtils的常用方法
static void    setProperty(Object bean, String name, Object value)  用来给对象中的属性赋值(了解)
参数1: 需要设置属性的对象   参数2: 需要修改的属性名称    参数3: 需要修改的具体元素

static String getProperty(Object bean, String name) 用来获取对象中的属性(了解)
参数1: 要获取的javaBean对象           参数2: 对象中的哪个属性

static void    populate(Object bean, Map properties) 用来给对象中的属性赋值(掌握)
参数1: 要设置属性的对象     参数2: 将属性以Map集合的形式传入(Key : 属性的名称;Value:  属性具体的值)
回复 使用道具 举报
一.反射:获取类对象(Class对象).
作用:运行时,获取类对象成员,调用成员.
主要是通过创建该类的字节码对象再来创建该类的对象
Class.forname(全类名)方法创建字节码对象,
另外还有: 类名.class 对象名.getclass
newInstance方法来创建该类的对象(通过空参)
主要的方法:
getConstructors()可以查看所有的public修饰的构造方法
getConstructor()括号带参数时,参数要用 数据类型.class ,不写为空参
通过 带有Declared的方法都是可以访问被私有修饰的方法
Field 是获取成员变量时返回的值,  有get和set方法
Invoke( 方法名,参数 )调用成员方法的方法 参数根据方法来定
注意:
通过反射获取的私有变量或者私有方法,都要用setAccessible()方法让JVM不检查.
二.JavaBean:
作用:用来封装数据,和普通的类多了生成一个序列号.
BeanUitls重要的方法:
Static void Populate(Object bean,Map map) 给对象中的属性赋值
                                                                                参数1: 要设置属性的对象
                                                                                参数2: 将属性以Map集合的形式传入
                                                                                                                Key : 属性的名称
                                                                                                        Value:  属性具体的值
注意:
在测试类中用Map集合添加的元素在对应的类中找不到相同的元素,所有需要捕获异常.
回复 使用道具 举报
康元中
  day13
  今天学习了反射相关的内容
1 反射可以获取一个类的成员和构造,以前我们是通过set/get创建对象来访问,现在用反射可以通过获取该类的字节码对象
然后字节码对象调用各种方法来访问成员和构造.
  首先是访问构造方法的步骤: 创建字节码对象(三种方式) Class.forName("全类名");
  然后调用Class类里的方法:
        ///创建有参构造------重点主要是传递参数这边要注意: 传递的是有参构造的  (变量类型.class) 不要加"";
         Constructor c = clazz.getConstructor(String.class,int.class);
             //通过有参构造创建对象(这个对象是在这边是Student 类对象)
            //这边注意(  参数的传递  )
            Object stu = c.newInstance("张飞",20); //传递参数
            //打印创建好的这个对象(已经重写toString 方法打印成员信息);
            System.out.println(stu);
    还有 Constructor[] c = clazz.getConstructors()//通过该类的字节码--可以访问所有public 修饰的构造方法;
         onstructor c = clazz.getConstructor();
2 获取成员变量的步骤:
        Field f = clazz.getDeclaredField("name");
                f.setAccessible(true);//暴力反射(获取私有的成员一定得开true)
                //通过这个字段给成员变量name赋予值;
                f.set(stu, "张飞");//参数1是成员变量所在的对象/参数2是给成员变量赋的值
                Object name = f.get(stu);//参数是 该成员变量所在的对象
                System.out.println(name);
   还有
        Field[] getFields() 和        Field[] getDeclaredFields() 注意区别获取public修饰的/ 获取所有的包括私有
        Object get(Object obj) 和void set(Object obj, Object value) Field 字段里的方法
        Field getField(String name) 和Field getDeclaredField(String name)  

3获取成员方法的步骤:
       
       Method m = clazz.getMethod("setName",String.class);//参数1是方法的名字/参数2是参数.class
       m.invoke(stu, "张飞");// 参数1是 该类所在的对象/参数2是给这个参数赋值       
        System.out.println(stu);// 打印对象
        参照访问私有成员变量的方式,访问私有成员方法用到的方法getDeclaredMethod()
        还有其他的方法:
                Method[] m = clazz.getMethods();//打印public 修饰的所有方法                

  下午学习了BeanUtil 相关的知识
        1 javaBean的封装数据的操作一些操作规范
                                实例化一个serv。。。的接口且随机生成一个序列号
                                重写set/get方法和无参构造
        2学习自定义一个BeanUtil
         populate()参数一为bean对象参数二为Map集合。这个方法就是通过map集合的里面的键值对 给与bean对象
        赋值。
回复 使用道具 举报
康元中
  day13
  今天学习了反射相关的内容
1 反射可以获取一个类的成员和构造,以前我们是通过set/get创建对象来访问,现在用反射可以通过获取该类的字节码对象
然后字节码对象调用各种方法来访问成员和构造.
  首先是访问构造方法的步骤: 创建字节码对象(三种方式) Class.forName("全类名");
  然后调用Class类里的方法:
        ///创建有参构造------重点主要是传递参数这边要注意: 传递的是有参构造的  (变量类型.class) 不要加"";
         Constructor c = clazz.getConstructor(String.class,int.class);
             //通过有参构造创建对象(这个对象是在这边是Student 类对象)
            //这边注意(  参数的传递  )
            Object stu = c.newInstance("张飞",20); //传递参数
            //打印创建好的这个对象(已经重写toString 方法打印成员信息);
            System.out.println(stu);
    还有 Constructor[] c = clazz.getConstructors()//通过该类的字节码--可以访问所有public 修饰的构造方法;
         onstructor c = clazz.getConstructor();
2 获取成员变量的步骤:
        Field f = clazz.getDeclaredField("name");
                f.setAccessible(true);//暴力反射(获取私有的成员一定得开true)
                //通过这个字段给成员变量name赋予值;
                f.set(stu, "张飞");//参数1是成员变量所在的对象/参数2是给成员变量赋的值
                Object name = f.get(stu);//参数是 该成员变量所在的对象
                System.out.println(name);
   还有
        Field[] getFields() 和        Field[] getDeclaredFields() 注意区别获取public修饰的/ 获取所有的包括私有
        Object get(Object obj) 和void set(Object obj, Object value) Field 字段里的方法
        Field getField(String name) 和Field getDeclaredField(String name)  

3获取成员方法的步骤:
       
       Method m = clazz.getMethod("setName",String.class);//参数1是方法的名字/参数2是参数.class
       m.invoke(stu, "张飞");// 参数1是 该类所在的对象/参数2是给这个参数赋值       
        System.out.println(stu);// 打印对象
        参照访问私有成员变量的方式,访问私有成员方法用到的方法getDeclaredMethod()
        还有其他的方法:
                Method[] m = clazz.getMethods();//打印public 修饰的所有方法                

  下午学习了BeanUtil 相关的知识
        1 javaBean的封装数据的操作一些操作规范
                                实例化一个serv。。。的接口且随机生成一个序列号
                                重写set/get方法和无参构造
        2学习自定义一个BeanUtil
         populate()参数一为bean对象参数二为Map集合。这个方法就是通过map集合的里面的键值对 给与bean对象
        赋值。
回复 使用道具 举报
通过反射获得对象的三种方法:
1.通过对象.class
2.通过类名.getclass;
3.通过Class.for
创建构造Constructor
1.通过字节码对象调用  Constructor方法获取构造,可以是有参构造和无参构造 然后通过构造对象调用.newInstance方法返回一个对象;
2.直接用字节码对象调用newInstance获取对象
通过反射获取变量 Field;
首先要有 字节码对象 有了字节码对象就可以获取 类的对象;
有了类字节码对象就可以通过 getDeclaredField(这里传入一个变量名,这里会自动匹配在类中是否存在这个变量,如果不存在就会报错!)方法获取变量的对象;
有了变量对象就可以获取变量中的内容get(传入一个对象获取这个对象中的内容),set(传入一个对象获取这个对象中的内容,改变的参数);
通过反射获取方法mathod
这个和获取变量的很像;
也是通过字节码对象来获取的getMethod("传入一个方法名",如果有参数就写上 参数.Class)返回的是一个对象的字节码;
然后在对象的字节码后面点上一个invoke(传入一个类的对象,有参传参,没有就算了);
暴力反射setAccessible(true)
就是在你获取到的字节码变量或是字节码方法后面点上一个setAccessible(true),就可以让虚拟机无视你的权限修饰符都默认成public; 这样就可以随意访问了;
BeanUtils工具类的方法
static void        setProperty(需要修改的对象, 变量名, 修改的参数)// 给JavaBean对象的成员变量进行赋值

static String        getProperty(Object bean, String name) // 获取JavaBean对象的成员变量的值

将map对象中的内容传给对象,key是对象中的变量,value是变量的值;
static void        populate(Object bean, Map properties)//// 给JavaBean对象的成员变量进行赋值




回复 使用道具 举报
陈叶隆
今天学习了web前端开发,学习了html的一些书写格式,比如列表<ol>,字体<font>,超链接<a href=””>,超链接后面接的是要链接的路径,<form action>链接的是提交的路径,这两个区别我很容易搞混.还有<table>里面嵌套<table>看着逻辑不是很复杂,实际操作起来却很难.<form>的格式是<input type=”” name>,这里最重要的是一定要写name,这个是以后跟我们后台接收数据息息相关的.
回复 使用道具 举报
李成林
html的学习总结
今天学习的内容很多都是需要记忆的在逻辑上没有太大问题
主要学习的标签有:
排版标签:<h><p><b><i><u>
图片标签:"<img src width height alt>
序列标签: 有序<ol><li>无序<ul><li>
超链接: <a> 属性herf连接路径 target 打开方式有_self,_blank;
表格标签:<table>属性有width.height.border(边界).align(位置)
<tr>行属性有 background(背景图片)<td>列属性colspan(跨列合并)rowspan(跨行合并)
表单标签:<form>(在form范围内的可以跳转)
form属性action提交路径 method 提交方式


<input(输入) type.......>
text 文档框
password 密码框
radio单选
checkbox 复选
button 普通按钮
fiel 文件
reset重置
hiddn隐藏
下拉列表:<select>(挑选)<option>(选项)
文本域:<textarea> 属性cols 列 rows 行
回复 使用道具 举报
Do1 中级黑马 2018-5-16 09:07:01
91#
今天学习了DIV


DIV在HTML前端页面布局中,非常重要,我们经常遇到的问题是:DIV居中,DIV自适应高度等等,下面就来总结一下。
多个div使用会自动换行,应该使用float属性
  left :  对象浮在左边
  right :  对象浮在右边
例如:
  float: left  和 float: right 是两个div左右排列在同一行
<div style="width: 20%; float: left; height: 100%">图片</div>
<div style="width: 50%; float: right; height: 100%">图片</div>
等,所以div很好用
回复 使用道具 举报
李志勇:
bootstrap:
http://www.bootcss.com
-全局CSS样式
- 组件
- javaScript插件
这三个查询  可以更快更加准确的对HTML页面作的更加美观;
MYSQL:
是文件管理系统   关系型数据库,存放的是实体之间的关系;
学习了  数据库的增删改查  这些功能  初步的接触数据库;
一台数据库服务器中会创建很多数据库(一个项目,会创建一个数据库)。在数据库中会创建很多张表(一个实体会创建一个表)。在表中会有很多记录(一个对象的实例会添加一条新的记录)。
create database 数据库名 [character set 字符集 collate 字符集校对规则];
?查看数据库服务器中所有的数据库:show databases;
查看某个数据库的定义信息: show create database 数据库名称
alter database 数据库名称 character set 字符集 collate 校对规则;
drop database 数据库名称
?切换数据库:use 数据库名称;
查看当前正在使用的数据库  selecte database();
?create table 表名称(字段名称 字段类型(长度) 约束,字段名称 字段类型(长度) 约束…);
回复 使用道具 举报
郑志祥
反射可以干嘛(目的)?
操作类中的属性,方法,构造。


new 对象也可以操作 为什么要用反射?
因为有些时候,
比如私有的构造方法,new不出来,可以通过反射来获取。


Web.xml的Servlet就是通过反射来实现的(权限地名)

获得类字节码对象三种方式;
1.通过类名.clss (在javaBean使用)
2.通过对象getclass
3.使用class的forname的静态方法获得(推荐使用)因为通用性比较高。可以在java中编写,也可以在web.xml的配置文件使用。



二。通过反射来操作构造方法
反射的第一步都是获得对象。

第二步获取有参构造(如果是私有的构造)
getDeclaredConstructor
setAcceddible(解除私有构造)


三。通过反射来获得属性(field)
clazz.getDeclaredField(获得私有的属性)
setAcceddible(解除私有构造)




四,通过反射获得类中的方法(掌握)
.getDeclaredMethod


利用BeanUtils需要到2个包     1.dbUtils    2.logging


事物是对数据库mysql的操作,与java代码无关
为什么要在Service添加事物管理?
因为Service是调用Dao里面的方法,我们是要让这两个方法同时进行。(要嘛都成功,要嘛都失败)

回复 使用道具 举报
12345
您需要登录后才可以回帖 登录 | 加入黑马