反射操作

S要想使用反射,所有的反射都指向一个类:java.lang.Class

  1. 得到反射类

这里有三种方式可以得到:

  1. 通过对象来获取

Class cls = master.getClass();

  1. 通过类来获取

Class cls = Master.class;

  1. 通过字符串,来得到Class对象,这种方式是我们使用最广泛的一种方式,如Hibernate,mybatis的映射文件

Class cls = Class.forName("cn.jbit.po.Master");

  1. 根据得到的Class对象,获得相应的Master对象
  1. 调用无参构造,来获得对象

Master master = (Master) cls.newInstance();

  1. 先获得指定的构造,然后利用这个构造方法,来获得对象

//得到指定的构造 方法,如果有多个参数,中间用","隔开

Constructor con =  cls.getDeclaredConstructor(String.class,Integer.class);

//当没有无参构造,或者无参构造为private修饰的时候,我们不能够再使用newinstance的方式来实例化了

//这时候,我们只能先获取指定构造,然后再来实例化

Object obj = con.newInstance("abc",1);

  1. 获得构造

//获得所有的构造方法,private修饰的构造不能获得

Constructor[] cons = cls.getConstructors();

for(int i=0;i<cons.length;i++){

System.out.println(cons[i]);

}

//获得本类所有的构造方法,包括private修饰的构造

Constructor[] cons = cls.getDeclaredConstructors();

for(int i=0;i<cons.length;i++){

System.out.println(cons[i]);

}

//得到指定的构造 方法,如果有多个参数,中间用","隔开

Constructor con =  cls.getDeclaredConstructor(String.class,Integer.class);

//也可以使用另一种方式来获得:cls.getConstructor(parameterTypes)

  1. 获得方法

//获得所有的方法,包括继承自父类的方法,但只能是public 修饰的方法

Method[] ms =  cls.getMethods();

for(int i=0;i<ms.length;i++){

System.out.println(ms[i]);

}

//获得本类所有的方法,不包括继承自父类的方法,但private 修饰的方法也能获得

Method[] ms =  cls.getDeclaredMethods();

for(int i=0;i<ms.length;i++){

System.out.println(ms[i]);

}

//获得指定方法(无参)

Method ms =  cls.getDeclaredMethod("show");

System.out.println(ms);

//获得指定方法(有参)

Method ms =  cls.getMethod("print", String.class);

System.out.println(ms);

//通过invoke调用方法,obj表示在哪个对象里调用方法,后续的参数都是方法的传入的参数

String str = (String) ms.invoke(obj, "测试有参方法");

System.out.println("方法执行的结果:"+str);

//获得指定方法(无参)

Method ms =  cls.getDeclaredMethod("show");

System.out.println(ms);

//因为show()方法为私有化方法,所以需要先解除封装后,才能调用

ms.setAccessible(true);

ms.invoke(obj);

  1. 管理属性

//获得所有的public修饰的属性(继承自父类的属性也能获得),private修饰的属性不能获得

Field [] fs = cls.getFields();

for(int i=0;i<fs.length;i++){

System.out.println(fs[i]);

}

//获得本类所有的属性(继承自父类的属性不能获得),private修饰的属性也能获得

Field [] fs = cls.getDeclaredFields();

for(int i=0;i<fs.length;i++){

System.out.println(fs[i]);

}

//获得指定的属性

Field f = cls.getDeclaredField("mastername");

//mastername属性为私有的,所以要先解除封装

f.setAccessible(true);

System.out.println(f.get(obj));

//修改指定的属性

Field f = cls.getDeclaredField("mastername");

f.setAccessible(true);

f.set(obj, "lisi");

System.out.println(f.get(obj));

时间: 2024-11-03 20:58:46

反射操作的相关文章

跟王老师学反射(八):使用反射操作数组

跟王老师学反射(八):使用反射操作数组 主讲教师:王少华   QQ群号:483773664 学习内容 使用反射操作数组 在java.lang.reflect包下还提供了一个Array类,Array对象可以代表所有的数组.程序可以通过使用Array来动态创建数组. 一.传统的创建数组的方法 1 2 3 4 5 6 7 8 public   static   void  main(String[] args)  {        int vec[] = new int[]{1, 5, 3};  //

反射操作辅助类ReflectionUtil

这篇文章的目的是介绍这样一种方式,就是在写一个函数的时候,传递的参数是object类型的,在这个函数里面想访问这个参数对象的某一属性值,我们知道这个属性值的name,但是一般情况下,object对象是没法获取具体属性的值的,所以用下面的方式可以获取.此文章为转载,原文在:http://lsyyxcn.blog.163.com/blog/static/22740531201002792629559/ /// <summary> /// 反射操作辅助类 /// </summary> p

Atitit.&#160;Class&#160;&#160;元数据的反射操作&#160;api&#160;apache&#160;&#160;工具

Atitit. Class  元数据的反射操作 api apache  工具 1 BeanUtils & PropertyUtils & MethodUtils类使用方法 - 短裤党 ConstructorUtils1 2 New实例 ConstructorUtils.invokeConstructor1 3 调用方法 MethodUtils2 4 参考3 1 BeanUtils & PropertyUtils & MethodUtils类使用方法 - 短裤党 Constr

java学习--基础知识进阶第十三天--反射机制的概述和字节码对象的获取方式、反射操作构造方法、成员方法、成员属性、JavaBean的概述&amp;BeanUtils的使用、自定义BeanUtils工具类

今日内容介绍 u 反射机制的概述和字节码对象的获取方式 u 反射操作构造方法.成员方法.成员属性 u JavaBean的概述&BeanUtils的使用 u 自定义BeanUtils工具类 第1章 反射机制概述.字节码对象的获取方式.反射操作构造方法.成员方法.成员属性 1.1 反射机制的概述和字节码对象的获取方式 1.1.1 反射介绍 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法        这种动态获取的以及动

内省Introspector(反射操作javaBean)

一:内省是一种特殊的反射,来更方便的操作javaBean对象,通过内省可以获取到类字节码的描述器, 然后解剖每一个字段,获取每个字段的读写方法,即get/set方法的反射,然后获取或者是封装bean的value 下面是通过内省向Bean中set值得示例: public static <T> T toBean(T t){ Class<?> clazz = t.getClass(); try { //根据Class对象获取该类的BeanInfo信息 BeanInfo beanInfo

.Net实战之反射操作篇

1.上一讲中描述了反射中常见的类,仅仅是描述类与反射之间的关系.   但是实际是对数据的操作,  在反射中,数据如何操作? [MyTable("T_UserInfo")] public class UserInfo : Person, UserService { private static string nickname; private int _age2; private int _age; [DisplayName("年龄")] public int Age

利用反射操作bean的属性和方法

今天在开发中碰到这样一个场景:当请求添加项目下的目录时,传过来的是一个IndexModel,这个Model里有关于这个目录字段的详细信息,包括基础报表,实时,漏斗等信息(这些字段类型都是boolean),对应于页面上生成目录的多选框.现要将这些配置存入数据库,在数据库中存的是这个项目下的目录,比如说在页面勾选了基础报表这个选择框,就会在数据库中的menu表插入一条数据记录这个配置.这样一来,就需要对传递过来的这个IndexModel类的属性值进行判断,再决定插入数据库的信息. 下面是IndexM

根据实例类型反射操作数据库(简单通用表操作类)

这个类适用简单的表 1.有且只有id为主键, 2.并且实例类主键,也就是id应为字段,其他为属性 3.实例类名跟表名一样,字段属性跟列名一样 public class ProType { public int id; public string type { get; set; } public int array { get; set; } public string relyTpye { get; set; } public string etype { get; set; } } 下面就是

转载: 通过反射操作类的私有属性

原文地址: http://blog.csdn.net/qustmeng/article/details/54691933 对于类的私有属性,如果没有提供公用方法去修改它,我们可以通过反射方法实现.下面为简单例子 import java.util.ArrayList; import java.util.List; public class A { private List<Integer> list = new ArrayList<Integer>(); public List<