反射,

  获取字节码文件的方式:

    方式一: 对象.getClass();

    方式二: 类名.Class;

    方式三:   Class.forName(String Class);

  通过字节码文件获取对象

    定义一个Student对象

package day13;

public class Student {
private String name;
private int age;
public Student() {
super();
// TODO Auto-generated constructor stub
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
    public void run(int a){
    System.out.println("学生已经跑了"+a+"小时了......");
    } }

  

public class FieldDemo {
public static void main(String[] args) throws Exception {
//获取字节码文件
Class<?> forName = Class.forName("day13.Student");//Student为项目中的全路径
          //获取对象   
          Object newInstance = forName.newInstance(); } }

    通过字节码文件获取构造方法

public class FieldDemo {
public static void main(String[] args) throws Exception {
//获取字节码文件
Class<?> forName = Class.forName("day13.Student");
//获取构造方法对象
Object newInstance = forName.newInstance();
//获取构造方法列表
Constructor[] declaredConstructors = forName.getDeclaredConstructors();//获取构造方法列表
for (Constructor constructor : declaredConstructors) {
System.out.println(constructor);
}
Constructor constructor = forName.getConstructor();//获取空参构造
System.out.println(constructor);
Constructor<?> constructor2 = forName.getConstructor(String.class,int.class);//获取有参构造
System.out.println(constructor2);
Constructor<?>[] declaredConstructors2 = forName.getDeclaredConstructors();//获取私有和公有的构造方法列表
for (Constructor<?> constructor3 : declaredConstructors2) {
System.out.println(constructor3);
}
Constructor<?> c = forName.getDeclaredConstructor(String.class,int.class);//获取所有的(私有和公有)的有参构造
System.out.println(c);
Constructor<?> c1 = forName.getDeclaredConstructor();//获取所有的(私有和公有)的无参构造
System.out.println(c1);
}
}

  

     通过字节码文件和对象为字段赋值

  

public class FieldDemo {
public static void main(String[] args) throws Exception {
//获取字节码文件
Class<?> forName = Class.forName("day13.Student");
//获取构造方法对象
Object newInstance = forName.newInstance();
//获取字段
Field age = forName.getDeclaredField("age");//获取age字段
age.setAccessible(true);//如果是私有的则需要打开开关
age.set(newInstance,15);//设置age的值为15
Field name = forName.getDeclaredField("name");
name.setAccessible(true);
System.out.println(name.get(newInstance));//赋值前查看其值
name.set(newInstance,"张三");
System.out.println(name.get(newInstance));//赋值后查看其值
System.out.println(newInstance);//打印对象
}
}

      通过公共构造方法进行赋值

public class FieldDemo {
public static void main(String[] args) throws Exception {
//获取字节码文件
Class<?> forName = Class.forName("day13.Student");
//获取构造方法对象
Object o = forName.newInstance();
//获取字段
Constructor<?> constructor = forName.getConstructor(String.class,int.class);
//通过构造方法调用对象
Object newInstance2 = constructor.newInstance("张三",15);//同过构造方法进行赋值
System.out.println(newInstance2); }
}

      通过私有构造方法进行赋值

public class FieldDemo {
public static void main(String[] args) throws Exception {
//获取字节码文件
Class<?> forName = Class.forName("day13.Student");
//获取构造方法对象
Object o = forName.newInstance(); //获取字段
Constructor<?> constructor = forName.getDeclaredConstructor(String.class,int.class);
constructor.setAccessible(true);
//通过构造方法调用对象
Object newInstance2 = constructor.newInstance("张三",15);//同过构造方法进行赋值
System.out.println(newInstance2);
}
}

    通过方法get/Set方法进行赋值

public class FieldDemo {
public static void main(String[] args) throws Exception {
//获取字节码文件
Class<?> forName = Class.forName("day13.Student");
//获取构造方法对象
Object o = forName.newInstance();
//获取字段
Method[] methods = forName.getDeclaredMethods();//获取Student中全部方法
for (Method method : methods) {
//System.out.println(method);
}
System.out.println("------------");
//Method md = forName.getDeclaredMethod("setName");
Method md = forName.getMethod("setName",String.class);//传递参数
md.invoke(o, "张三");
Method md1 = forName.getDeclaredMethod("getName");//执行getName方法
Object name = md1.invoke(o);
System.out.println(name);
}
}

  通过字节码文件调用方法

  调用Student 类中的run(int a);

public class FieldDemo {
public static void main(String[] args) throws Exception {
//获取字节码文件
Class<?> forName = Class.forName("day13.Student");
//获取构造方法对象
Object o = forName.newInstance();
//参数一 方法名 参数二 参数类型对象的类 (参数列表)
Method m = forName.getMethod("run",int.class);
//参数一 对象 参数二 参数值(参数列表)
m.invoke(o, 2);
}
}

  

通过反射可以获取类中的所有成员方,成员变量,构造方法(包括私有)。  仅仅只需要一个字符串就可以搞定了

JavaBean  对数据的封装   其实就是标准类  用于存储字段的

BeanUtils包

  1.自己书写BeanUtils包

public class MyBeanUtils {
public static void setProperty(Object bean, String name, Object value) {//给单个字段设置值
Class<? extends Object> class1 = bean.getClass();
ArrayList<String> array=new ArrayList<String>();
Field[] fields = class1.getFields();
for (int i = 0; i < fields.length; i++) {
array.add(fields[i].getName());
}
Field[] declaredFields = class1.getDeclaredFields();
for (int i = 0; i < declaredFields.length; i++) {
array.add(declaredFields[i].getName());
}
if (array.contains(name)) {
try {
Field field = class1.getDeclaredField(name);
field.setAccessible(true);
field.set(bean, value);
} catch (Exception e) {
try{
Field field = class1.getField(name);
field.set(bean, value);}
catch(Exception e1){
}
}
}else{
System.out.println("你输入的字段["+name+"]不存在!");
}
}
public static Object getProperty(Object bean, String name) {//获取单个属性的值
Class<? extends Object> cs = bean.getClass();
Object object=null;
try {
Field field = cs.getDeclaredField(name);
field.setAccessible(true);
object = field.get(bean);
} catch (Exception e) { }
return object;
} public static void populate(Object bean, Map map){//设置多个字段值 Set keys = map.keySet();
for (Object key : keys) {
try{
setProperty(bean, (String) key, map.get(key));
}catch(Exception e){ }
}
}
}

  

day13(反射,BeanUtils包)的更多相关文章

  1. BeanUtils包的学习

    BeanUtils支持八种基本数据类型(int double short char byte float boolean long)的反射,对于日期需要提前注册DateLocalConvert获取转换 ...

  2. java 包之 BeanUtils包的使用

    BeanUtils工具包是由Apache公司所开发,主要是方便程序员对Bean类能够进行简便的操作. 在使用BeanUtils工具包之前我们需要的Jar包有以下几种: (1)   BeanUtils相 ...

  3. 配置BeanUtils包,同时也是对导入第三包的步骤说明

    BeanUtils是由Apache公司开发的针对操作JavaBean的工具包. 对于JavaBean,简单的来说,就是要有一个空参的构造器和对属性的getXXX方法和setXXX方法. 在由JDK提供 ...

  4. beanutils包下载

  5. BeanUtils: 威力和代价(转载)

    转自:http://blog.sina.com.cn/s/blog_ab3fbf1b0101jbxz.html Apache Jakarta Commons项目非常有用.我曾在许多不同的项目上或直接或 ...

  6. JDBC学习笔记(5)——利用反射及JDBC元数据编写通用的查询方法

    JDBC元数据 1)DatabaseMetaData /** * 了解即可:DatabaseMetaData是描述数据库的元数据对象 * 可以由Connection得到 */ 具体的应用代码: @Te ...

  7. BeanUtils 以及BeanUtils.populate使用

    Apache Jakarta Commons项目非常有用.我曾在许多不同的项目上或直接或间接地使用各种流行的commons组件.其中的一个强大的组件就是BeanUtils.我将说明如何使用BeanUt ...

  8. Apache BeanUtils 1.9.2 官方入门文档

    为什么需要Apache BeanUtils? Apache BeanUtils 是 Apache开源软件组织下面的一个项目,被广泛使用于Spring.Struts.Hibernate等框架,有数千个j ...

  9. 【转】JDBC学习笔记(5)——利用反射及JDBC元数据编写通用的查询方法

    转自:http://www.cnblogs.com/ysw-go/ JDBC元数据 1)DatabaseMetaData /** * 了解即可:DatabaseMetaData是描述数据库的元数据对象 ...

随机推荐

  1. linux——DNS服务器配置

    讲课,请不要在课堂上查找文件,浏览器搜索,会感觉你很不上心,玩听众,一定提前做很多遍,模拟很多遍: 演讲,请务必准备好材料,考虑听众的感受,一定不要让外行人云里雾里,听不懂你在讲什么,那就尴尬了, D ...

  2. Mysql生成索引的方式

    1.选择索引的数据类型 MySQL支持很多数据类型,选择合适的数据类型存储数据对性能有很大的影响.通常来说,可以遵循以下一些指导原则: (1)越小的数据类型通常更好:越小的数据类型通常在磁盘.内存和C ...

  3. javaweb登录界面连接数据库

    实验关键截图 数据库界面 建表 2.登录界面 登陆失败 5 注册页面 5 注册成功 数据库截图

  4. Linux就业技术指导(一):简历撰写及面试筹备要领

    一,开场 二,模型 三,目标选材 3.1 什么是目标选材 简单说就是确定一个候选人是否符合某一个工作岗位要求的整个流程.这是对招聘方的一个培训,应聘方如果掌握了,就知道应该怎样正确的去应聘工作. 3. ...

  5. Matlab中插值函数汇总(上)

    Matlab中插值函数汇总分上下两个部分,主要整合自matlabsky论坛dynamic发表于2009-2-21 21:53:26 的主题帖,以及豆丁网rickoon上传的教材第8章<插值,拟合 ...

  6. GridView,datalist添加序号列

    GridView添加序号列:这个是经常需要的一个功能 <asp:TemplateField HeaderText="序号"> <ItemTemplate> ...

  7. 转 Appium for Mac 环境准备篇

    转发地址:http://www.cnblogs.com/oscarxie/p/3894559.html 1. 爬墙因为后续安装过程中可能会碰到墙的问题,所以首先得解决爬墙的问题.我的方便,公司提供代理 ...

  8. vmware搭建vSAN提示磁盘不合格或者看不到磁盘的解决办法

    1.如果磁盘不合格,或者在创建磁盘组的时候看不到该磁盘,一般的原因都是该磁盘有其他分区,可以使用下面的方法来解决 a.首先开启esxi主机的ssh功能 b.登陆到esxi的后台 c. ls /dev/ ...

  9. python之ftp作业【还未完成】

    作业要求 0.实现用户登陆 1.实现上传和下载 3.每个用户都有自己的家目录,且只可以访问自己的家目录 4.对用户进行磁盘配额,每个用户的空间不同,超过配额不允许下载和上传 5.允许用户在指定的家目录 ...

  10. Weblogic 12c 一个domain建多个server(端口)

    一.基本概念 我觉得如果刚接触Weblogic,首先应该做的是明白几个基本的概念,可以从一张图入手: 1. 域(domain) 它是一个基本管理单元: 每个域包含一个管理服务器(Administrat ...