2016.3.4(反射)

//反射的使用:在运行时探究和使用编译时未知的类
/*
* 1、获取类的Class对象(其实所有的类型都有Class对象)
*/
//1-1、根据一个实例对象(排除了基本数据类型),产生Class对象---动态性最低
Student stu = new Student();
Class stuClass = stu.getClass();//来自于Object的方法
int[] array = new int[5];
Class arrayClass = array.getClass();

//1-2、根据类型名,获取Class对象---动态性低
Class stuClass1 = Student.class;
Class arrayClass1 = int[].class;
Class intClass = int.class;//基本数据类型.class的方式是JDK1.5以后提供的
Class voidClass = void.class;
Class intClass1 = Integer.TYPE;//JDK1.5以前,使用基本数据类型对应的包装类.TYPE

//1-3、根据类的字符串全类名,获取Class对象---动态性最高
Class stuClass2 = null;
try {
stuClass2 = Class.forName("com.lovo.bean.Student");//字符串全类名完全可以从程序外部输入
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

/*
* 2、探究Class对象中类的信息
*/
//2-1、探究类的声明部分
System.out.println("package " + stuClass.getPackage().getName() + ";");//得到包名
String allName = stuClass.getName();//得到类全名
String simpleName = stuClass.getSimpleName();//得到类的简单名
int classMod = stuClass.getModifiers();//得到类的修饰符
String classModStr = Modifier.toString(classMod);//得到修饰符的字符串形式
String superClassName = stuClass.getSuperclass().getName();//得到父类的Class对象
Class[] allInter = stuClass.getInterfaces();//得到所有接口的Class对象
String allInterNames = "";
for(int i = 0; i < allInter.length; i++){
allInterNames += allInter[i].getName();
if(i != allInter.length - 1){
allInterNames += ",";
}
}

System.out.println(classModStr + " class " + simpleName +
" extends " + superClassName + " implements " + allInterNames + "{");

System.out.println("//属性");
//2-2、属性的探究
Field[] allFields = stuClass.getDeclaredFields();//获取所有的属性
Field[] allPubicFields = stuClass.getFields();//获取所有的公共属性
//探究指定的属性
try {
Field field = stuClass.getDeclaredField("name");//根据属性名,返回指定的属性
Field publicField = stuClass.getField("height");//根据属性名,返回指定的公共属性
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

for(Field f : allFields){
String fieldMod = Modifier.toString(f.getModifiers());//得到属性的修饰符
String fieldTypeStr = f.getType().getName();//得到属性的类型名
String fieldName = f.getName();//得到属性的名字

System.out.println("\t" + fieldMod + " " + fieldTypeStr + " " + fieldName + ";");
}

System.out.println();
System.out.println("//构造");

//2-3、探究构造方法
Constructor[] allCons = stuClass.getDeclaredConstructors();//得到所有声明的构造
Constructor[] allPublicCons = stuClass.getConstructors();//得到所有公共的构造
try {
Constructor con = stuClass.getDeclaredConstructor(String.class,int.class);//得到指定的构造
Constructor publicCon = stuClass.getConstructor();//得到指定的公共构造
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

for(Constructor c : allCons){
String conModStr = Modifier.toString(c.getModifiers());//得到构造的修饰符
String conName = c.getName();//得到构造方法的名字
Class[] parametersClassArray = c.getParameterTypes(); //得到所有的参数
String paramStr = "";
for(Class paramClass : parametersClassArray){
paramStr += paramClass.getSimpleName() + ",";
}
if(parametersClassArray.length != 0){
paramStr = paramStr.substring(0,paramStr.length()-1);
}
System.out.println("\t" + conModStr + " " + conName + "(" + paramStr + ")");
}

System.out.println();
System.out.println("//方法");

//2-4、探究方法
Method[] allMethods = stuClass.getDeclaredMethods();//得到所有声明的方法
Method[] allPublicMethods = stuClass.getMethods();//得到所有的公共方法

try {
Method method = stuClass.getDeclaredMethod("answer");//得到指定的声明方法
Method publicMethod = stuClass.getMethod("study",int.class);//得到指定的公共方法
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

for(Method m : allMethods){
String methodMod = Modifier.toString(m.getModifiers());
String returnStr = m.getReturnType().getName();
String methodName = m.getName();
String paramStr = "";
Class[] params = m.getParameterTypes();
for(int i = 0; i < params.length; i++){
paramStr += params[i].getName();
if(i != params.length - 1){
paramStr += ",";
}
}

System.out.println("\t" + methodMod + " " + returnStr + " "
+ methodName + "(" + paramStr + ")");
}
System.out.println("}");

/*
* 3、使用反射获取的信息
*/
//3-1、根据反射产生对象
//3-1-1、通过Class对象获取Constructor对象,然后产生实例对象(好处:可以调用任意符合访问修饰符的构造方法;坏处:代码太多)
// Constructor con = null;
// try {
// con = stuClass.getConstructor(String.class);
// } catch (NoSuchMethodException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// } catch (SecurityException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
//
// try {
// Student stu1 = (Student)con.newInstance("zhang3");//使用Constructor的newInstance方法产生对象
// Student stu2 = (Student)con.newInstance("zhang3");
// System.out.println(stu1);
// System.out.println(stu2);
// } catch (InstantiationException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// } catch (IllegalAccessException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// } catch (IllegalArgumentException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// } catch (InvocationTargetException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
//3-1-2、直接通过Class对象产生实例对象(好处:代码少;坏处:只能调用到公共无参构造)
// try {
// Student stu1 = (Student)stuClass.newInstance();
// System.out.println(stu1);
// } catch (InstantiationException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// } catch (IllegalAccessException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }

//3-2、根据反射调用方法
// try {
// Method m = stuClass.getMethod("study",int.class);
// m.invoke(null,4);//使用Method对象提供的invoke方法,调用Method所代表的方法
// } catch (NoSuchMethodException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// } catch (SecurityException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// } catch (IllegalAccessException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// } catch (IllegalArgumentException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// } catch (InvocationTargetException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }

//3-3、根据反射操作属性
try {
Field f = stuClass.getField("height");
f.set(stu,1.8f);//用set方法赋值
System.out.println(f.get(stu));//用get方法取值

} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

}

时间: 2024-10-14 09:45:33

2016.3.4(反射)的相关文章

2016/05/04(反射)

反射:重点----每天都用反射,但是每天都不写反射     Java的反射技术是java程序的特征之一,它允许运行中的Java程序对自身进行检查,或者说“自审”,并能直接操作程序的内部属性. 使用反射可以获得Java类中各个成员的名称并显示出来.简单的说,反射就是让你可以通过名称来得到对象(类,属性,方法)的技术. 反射的作用? 可以通过反射机制发现对象的类型,发现类型的方法/属性/构造器? 可以创建对象并访问任意对象方法和属性等 主要点:运行时探究和使用编译时未知的类 Dog d1 = new

2016/4/17 反射

反射 作为一个主要内容 (听说)理论多余实际    反射主要(目前只知道) 想要反射某个目标  先需要取得目标的属性,名字       在程序运行之前就知道这叫做   运行前取得 在程序运行时 从类加载器中 获取叫做    运行期取得 用途:  一般JAVA文件都是以class类型进行传送   所以需要使用里面的方法就得用到反射 ; 以class命名的类中有许多方法来获取class文件的属性信息  一般以Field 这个类将class文件的信息提取出来 找到该方法的路径 能清楚的显示路径名  类

聊一聊前端模板与渲染那些事儿

欢迎大家收看聊一聊系列,这一套系列文章,可以帮助前端工程师们了解前端的方方面面(不仅仅是代码): https://segmentfault.com/blog/frontenddriver 作为现代应用,ajax的大量使用,使得前端工程师们日常的开发少不了拼装模板,渲染模板.我们今天就来聊聊,拼装与渲染模板的那些事儿. 如果喜欢本文请点击右侧的推荐哦,你的推荐会变为我继续更文的动力 1 页面级的渲染 在刚有web的时候,前端与后端的交互,非常直白,浏览器端发出URL,后端返回一张拼好了的HTML串

使用 Raspberry Pi 上的传感器在 Node.js 中创建一个 IoT Bluemix 应用程序

先决条件 一个IBM Bluemix 帐号,一个 Raspberry Pi 2 或 3,一个 PIR 运动传感器 适用于本文的 Github 存储库 如果您是一位精明的 Bluemix 开发人员,您可能只想看看如何在 node.js 中与 IoT 建立连接,或者只想了解如何从此 github 存储库中拉取我的代码. git clone https://github.com/nicolefinnie/iot-nodejs-tutorial 以下是实现与 IBM IoT 平台连接在一起的 4 个 R

2016.5.23 用反射技术为实体类变量赋值、取值

clobj是任意一个数据库表对应的实体类空白实例 TERMINAL_PRO clobj= new TERMINAL_PRO(); DataRow row = dtt.Rows[0]; Type t = clobj.GetType(); foreach (PropertyInfo pi in t.GetProperties()) //不用考虑属性的类型 { string name = pi.Name; //获得此属性名称 if (dtt.Columns.Contains(name)) { obje

17.Java 反射机制

1.反射的定义 反射之中包含了一个"反"的概念,所以要想解释反射就必须先从"正"开始解释,一般而言,当用户使用一个类的时候,应该先知道这个类,而后通过这个类产生实例化对象,但是"反"指的是通过对象找到类. 2.Class对象 2.1 概述 Class对象是反射的起点,可以利用类的Class对象创建类的实例(newInstance),同时提供了操作类的工具,可以获取类的详细信息,并且使用特殊的技术实现类的加载(运行时加载,在编译的时候还没有该类的c

2016/09/20

1. Python序列化之pickle模块 - 用于[python特有的类型]和[python基本数据类型]间进行转换 - pickle模块提供了四个功能:dumps.dump.loads.load - json更加适合跨语言 基本数据类型的序列化  pickle仅适用于python 复杂类型的序列化 # import json # dic = {'k1': 'v1'} # print(dic, type(dic)) # # res = json.dumps(dic) # 将python的基本数

使用反射生成并操作对象

一.获取Class对象的方式 Java中,每个类被加载到内存中,系统就会为该类生成一个对应的Class对象,通过该Class对象就可以访问到JVM中的这个类,获得Class对象有三种方式: 1.使用Class类的forName(String clazzName)静态方法,该方法需要传入字符串参数,该字符串参数的值是某个类的全限定类名. 2.通过某个类的class属性获取,例如Person.class. 3.调用某个对象的getClass()方法.该方法是java.lang.Object类中的一个

利用反射获取静态类的静态属性值(已知属性名称的字符串表示)

列如获取Phone属性的值 typeof(ExcelColumnName).GetProperty(“Phone”).GetValue(null, null)//ExcelColumnName是静态类 ExcelColumnName类如下: 1 /// <summary> 2 /// 要上传的excel所包含的列 3 /// </summary> 4 public static class ExcelColumnName 5 { 6 public static string Pho