java反射获取类的类名、属性名、属性类型、方法、执行方法、构造函数
public class Demo02 {
@SuppressWarnings("all")
public static void main(String[] args) throws Exception {
// 另一个com.sg.myReflection.bean包下的User类
String path = "com.sg.myReflection.bean.User";
try {
Class clazz = Class.forName(path);
// 获取类名
String strName01 = clazz.getName();// 获取完整类名com.sg.myReflection.bean.User
String strName02 = clazz.getSimpleName();// 直接获取类名 User
// 获取属性
Field[] field01 = clazz.getFields(); // 返回属性为public的字段
Field[] field02 = clazz.getDeclaredFields(); // 返回所有的属性
Field field03 = clazz.getDeclaredField("id"); // 获取属性为id的字段
// 获取普通方法
Method[] Method01 = clazz.getDeclaredMethods(); // 返回public方法
Method method = clazz.getDeclaredMethod("getId", null); // 返回getId这个方法,如果没有参数,就默认为null
// 获取构造方法
User u1 = (User) clazz.newInstance(); // 获取无参的构造函数这里的前提的保证类中应该有无参的构造函数
// 获取参数为(int,String,int)的构造函数
Constructor c2 = clazz.getDeclaredConstructor(int.class, String.class, int.class);
// 通过有参构造函数创建对象
User u2 = (User) c2.newInstance(1001, "小小", 18);
// 通过反射调用普通方法
User u3 = (User) clazz.newInstance();
Method method03 = clazz.getDeclaredMethod("setId", int.class);
method.invoke(u3, 1002); // 把对象u3的id设置为1002
// 通过反射操作普通的属性
User u4 = (User) clazz.newInstance();
Field f = clazz.getDeclaredField("name");
f.setAccessible(true); // 设置属性可以直接的进行访问
f.set(u4, "石头");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
public static void getObjectValue(Object object) throws Exception {
//我们项目的所有实体类都继承BaseDomain (所有实体基类:该类只是串行化一下)
//不需要的自己去掉即可
if (object != null && object instanceof BaseDomain) {//if (object!=null ) ----begin
// 拿到该类
Class<?> clz = object.getClass();
// 获取实体类的所有属性,返回Field数组
Field[] fields = clz.getDeclaredFields();
for (Field field : fields) {// --for() begin
System.out.println(field.getGenericType());//打印该类的所有属性类型
// 如果类型是String
if (field.getGenericType().toString().equals(
"class java.lang.String")) { // 如果type是类类型,则前面包含"class ",后面跟类名
// 拿到该属性的gettet方法
/**
* 这里需要说明一下:他是根据拼凑的字符来找你写的getter方法的
* 在Boolean值的时候是isXXX(默认使用ide生成getter的都是isXXX)
* 如果出现NoSuchMethod异常 就说明它找不到那个gettet方法 需要做个规范
*/
Method m = (Method) object.getClass().getMethod(
"get" + getMethodName(field.getName()));
String val = (String) m.invoke(object);// 调用getter方法获取属性值
if (val != null) {
System.out.println("String type:" + val);
}
}
// 如果类型是Integer
if (field.getGenericType().toString().equals(
"class java.lang.Integer")) {
Method m = (Method) object.getClass().getMethod(
"get" + getMethodName(field.getName()));
Integer val = (Integer) m.invoke(object);
if (val != null) {
System.out.println("Integer type:" + val);
}
}
// 如果类型是Double
if (field.getGenericType().toString().equals(
"class java.lang.Double")) {
Method m = (Method) object.getClass().getMethod(
"get" + getMethodName(field.getName()));
Double val = (Double) m.invoke(object);
if (val != null) {
System.out.println("Double type:" + val);
}
}
// 如果类型是Boolean 是封装类
if (field.getGenericType().toString().equals(
"class java.lang.Boolean")) {
Method m = (Method) object.getClass().getMethod(
field.getName());
Boolean val = (Boolean) m.invoke(object);
if (val != null) {
System.out.println("Boolean type:" + val);
}
}
// 如果类型是boolean 基本数据类型不一样 这里有点说名如果定义名是 isXXX的 那就全都是isXXX的
// 反射找不到getter的具体名
if (field.getGenericType().toString().equals("boolean")) {
Method m = (Method) object.getClass().getMethod(
field.getName());
Boolean val = (Boolean) m.invoke(object);
if (val != null) {
System.out.println("boolean type:" + val);
}
}
// 如果类型是Date
if (field.getGenericType().toString().equals(
"class java.util.Date")) {
Method m = (Method) object.getClass().getMethod(
"get" + getMethodName(field.getName()));
Date val = (Date) m.invoke(object);
if (val != null) {
System.out.println("Date type:" + val);
}
}
// 如果类型是Short
if (field.getGenericType().toString().equals(
"class java.lang.Short")) {
Method m = (Method) object.getClass().getMethod(
"get" + getMethodName(field.getName()));
Short val = (Short) m.invoke(object);
if (val != null) {
System.out.println("Short type:" + val);
}
}
// 如果还需要其他的类型请自己做扩展
}//for() --end
}//if (object!=null ) ----end
}
// 把一个字符串的第一个字母大写、效率是最高的、
private static String getMethodName(String fildeName) throws Exception{
byte[] items = fildeName.getBytes();
items[0] = (byte) ((char) items[0] - 'a' + 'A');
return new String(items);
}
java反射获取类的类名、属性名、属性类型、方法、执行方法、构造函数的更多相关文章
- java 反射获取类的属性 类型 名称和值
/** * 获取属性类型(type),属性名(name),属性值(value)的map组成的list * */ private List getFiledsInfo(Object o){ Field[ ...
- Java反射获取类和对象信息全解析
反射可以解决在编译时无法预知对象和类是属于那个类的,要根据程序运行时的信息才能知道该对象和类的信息的问题. 在两个人协作开发时,你只要知道对方的类名就可以进行初步的开发了. 获取类对象 Class.f ...
- Java反射获取类对象的三种方式
package demo01; /* * 获取一个类的class文件对象的三种方式 * 1.对象获取 * 2.类名获取 * 3.Class类的静态方法获取 */ public class Reflec ...
- java反射获取类的成员函数,成员变量,构造函数
package com.imooc.reflect;import javax.sound.midi.Soundbank;import java.lang.reflect.Constructor;imp ...
- java 反射获取类的静态属性值
public class AppTest { private NodeClass nodeClass; public static String hehe = "hehe"; pu ...
- Java反射学习-1 - 反射获取类的属性,方法,构造器
新建一个Person类 package cn.tx.reflect; /** * 注解初步了解 * @author Administrator * */ public class Person { p ...
- java利用反射获取类的属性及类型
java利用反射获取类的属性及类型. import java.lang.reflect.Field; import java.math.BigDecimal; import java.util.Map ...
- java 通过反射获取类属性结构,类方法,类父类及其泛型,类,接口和包
首先自定义三个类 package reflection1; public interface MtInterface { void info(); } package reflection1; imp ...
- java反射获取和设置实体类的属性值 递归所有父类
最近做一个通用数据操作接口,需要动态获取和设置实体类的属性值,为了通用实体做了多重继承,开始网上找到代码都不支持父类操作,只能自己搞一个工具类了,此工具类可以设置和获取所有父类属性,代码贴下面拿走不谢 ...
随机推荐
- Eclipse搭建Android环境失败的解决方案
今天在Eclipse上搭建Android开发环境,不仅在安装ADT的过程中老是出错,而且Android SDK下载后,打开SDK Manager时也无法链接到网页下载tools,网上查了好多方法,试了 ...
- Android使用Canvas实现跑马灯
网上的很多的教程都是通过更改TextView的属性进行跑马灯的设计.这样做有很多的缺点: 1.如果TextView没有获取焦点,那么跑马灯的效果无法实现. 2.如果文本长度小于TextView的宽度, ...
- 三消游戏FSM状态机设计图
三消游戏FSM状态机设计图 1) 设计FSM图 2) smc配置文件 ///////////////////////////////////////////////////////////////// ...
- 框架页面高度自动刷新Javascript脚本
实现原理:加载index.htm时候,每隔1秒钟自动调用脚本刷新框架页面代码 代码优点:只需要设置index.html框架页面中的脚本,调用加载的子页面中不需要设置任何代码. index.htm代码如 ...
- PS图层混合算法之一(不透明度,正片叠底,颜色加深,颜色减淡)
下列公式中,A代表了上面图层像素的色彩值(A=像素值/255),B代表下面图层像素的色彩值(B=像素值/255),C代表了混合像素的色彩值(真实的结果像素值应该为255*C).该公式也应用于层蒙板. ...
- 【UML 建模】UML建模语言入门-视图,事物,关系,通用机制
. 作者 :万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/18964835 . 一. UML视图 1. Ration ...
- HashMap二三事
先看看hashmap在整个Collection中的位置 HashMap中存储数据的结构是 /** * The table, resized as necessary. Length MUST Alwa ...
- HBase rest
HBase Rest 是建立在HBase java 客户端基础之上的,提供的web 服务.它存在的目的是给开发者一个更多的选择. 1.启动rest 服务 (1)hbase rest start 用默认 ...
- gtk+修改控件文本字体一例
因为家里电脑是Mac系统,所以就拿Mac系统来示范. 要注意的是gtk+2.0和3.0对字体的处理是有一些区别的: 1.后者使用的是pango的机制,我们这里以gtk+3.0为基础. 2.两者调用Fo ...
- Android绘图机制(四)——使用HelloCharts开源框架搭建一系列炫酷图表,柱形图,折线图,饼状图和动画特效,抽丝剥茧带你认识图表之美
Android绘图机制(四)--使用HelloCharts开源框架搭建一系列炫酷图表,柱形图,折线图,饼状图和动画特效,抽丝剥茧带你认识图表之美 这里为什么不继续把自定义View写下去呢,因为最近项目 ...