Java反射技术

目录

    • 1. 什么是反射,为何用它
    • 2. Student类
    • 3. Person类
    • 4. 反射实现

以测试学生类为主

1. 什么是反射,为何用它

1.1 什么是反射:允许程序员在程序运行期间动态的获得某个类型的信息(类本身的信息以及类的成员信息),从而开发出更为灵活通用的代码
反射能做什么,例如:

  1. String className = “com.hr.entity.Student”;
    使用上面的字符串变量值创建出其对象的对象
  2. 类中的私有属性和方法如何去调用

1.2. 反射操作的前提条件:

1.2.1 获得一个类型对应的类对象

		// 1. 类.classClass<Student> stu = Student.class;Student student = new Student();// 2. 对象.getClass()Class<?> class1 = student.getClass();try {// Class.forName("类的路径")Class<?> class2 = Class.forName("com.lovely.reflect.Student");} catch (ClassNotFoundException e) {e.printStackTrace();}

1.2.2 什么是类对象?
即Class这个类的对象,该对象就是用来描述一个类型的基本信息以及该类型中所有的成员信息

1.2.3 如何在java中获取类对象?

  1. 类.class 在编译期类型就已经定死了,但写法最简单
  2. 对象.getClass()在编译期类型就已经定死了
  3. Class.forName(“类型全路径”) 写法麻烦,字符串类型容易写错,但是此写法灵活

2. Student类


```java
package com.lovely.reflect;import java.io.Serializable;import javax.management.RuntimeErrorException;public class Student extends Person implements Serializable {private static final long serialVersionUID = 1L;private Integer id;private String name;public Integer age;public Student() {}Student(String name, Integer age) throws RuntimeErrorException, Exception {this.name = name;this.age = age;}public Student(Integer id, String name, Integer age) {this.id = id;this.name = name;this.age = age;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}void show() {String str = study("odorable");System.out.println(str);}public void show(String name) {this.name = name;System.out.println("我是" + name);}private String study(String name) {return name + "要学习。";}@Overridepublic String toString() {return "Student [id=" + id + ", name=" + name + ", age=" + age + "]";}}

3. Person类

package com.lovely.reflect;public class Person {private String name;public Integer age;public Person() {this.age = 100;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}void show() {}}

4. 反射实现

package com.lovely.reflect;import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;public class Test1 {public static void main(String[] args) {// testClassInfo();// testConstructor();// testCharacter();testMethod();}@SuppressWarnings("rawtypes")static void testClassInfo() {// 反射得到类加载的信息Student stu = new Student();Class stuClass = stu.getClass();// 访问修饰符System.out.println(stuClass.getModifiers()); // 返回修饰符所对应的数字System.out.println("此类修饰符是:" + Modifier.toString(stuClass.getModifiers()));// 类的路径 和 类名System.out.println(stuClass.getName() + "\t" + stuClass.getSimpleName());// student所在的包名Package pkg = stuClass.getPackage();System.out.println(pkg.getName());// student 的父类名Class superClass = stuClass.getSuperclass();System.out.println("stu父类:" + superClass.getSimpleName());while (true) {if (stuClass != null) {System.out.println("学生类的继承体系:" + stuClass.getName());stuClass = stuClass.getSuperclass();} else {break;}}// 创建类对象try {stuClass = stu.getClass();stu = (Student) stuClass.newInstance();System.out.println(stu);} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}System.out.println("学生类实现的接口类型:");Class[] interfaces = stuClass.getInterfaces();for (Class inter : interfaces) {System.out.println(inter);}}static void testConstructor() {// 反射得到类的构造信息Class<Student> stuClass = Student.class;try {// getConstructor() 只可拿到public的构造Constructor<Student> cs = stuClass.getConstructor();Student stu = cs.newInstance();System.out.println(stu);System.out.println(cs.getModifiers() + "\t" + cs.getName());// 拿到非public构造类cs = stuClass.getDeclaredConstructor(String.class, Integer.class);// 授权访问// cs.setAccessible(true);// 用构造类创建student 对象 参数和上面对应stu = cs.newInstance("小明", 19);System.out.println(stu);// 三个构造cs = stuClass.getDeclaredConstructor(Integer.class, String.class, Integer.class);stu = cs.newInstance(1, "point", 18);System.out.println(stu);System.out.println("获得构造的参数, 返回类对象数组====");cs = stuClass.getDeclaredConstructor(String.class, Integer.class);// 拿到当前构造类的 构造参数Class<?>[] parameterTypeClass = cs.getParameterTypes();for (Class<?> type : parameterTypeClass) {System.out.println(type);}System.out.println("获得异常=====");// 获得构造的异常Class<?>[] exTypes = cs.getExceptionTypes();for (Class<?> exType : exTypes) {System.out.println(exType);}} catch (Exception e) {		e.printStackTrace();}}static void testCharacter() {// 反射得到类的属性信息Student stu = new Student();Class<Student> stuClass = Student.class;try {// 通过名字获取子父类中的属性对象(public)子类没有 找父类Field filed = stuClass.getField("age");// age属性的名称和修饰符System.out.println(filed.getName() + "\t" + Modifier.toString(filed.getModifiers()));filed.set(stu, 1);System.out.println("反射赋值age: " + filed.get(stu));// 通过名字获取当前类的属性对象,不管什么修饰符filed = stuClass.getDeclaredField("id");System.out.println(filed.getName() + "\t" + filed.getType() + "\t" + Modifier.toString(filed.getModifiers()));// 赋予可访问权限filed.setAccessible(true);filed.set(stu, 1);Object obj = filed.get(stu);System.out.println("反射赋值id: " + obj);System.out.println("===========");// 拿到当前类和父类的共有属性对象Field[] fs = stuClass.getFields();for (Field f : fs) {System.out.println(f.getName() + ":" + f.get(stu));}System.out.println("===========");// 拿到当前类的所有属性对象fs = stuClass.getDeclaredFields();for (Field f : fs) {f.setAccessible(true);System.out.println(f.getName() + ":" + f.get(stu));}} catch (Exception e) {e.printStackTrace();} 		}static void testMethod() {// 反射得到类的方法信息try {Class<?> stuClass = Class.forName("com.lovely.reflect.Student");// 获得student类指定名字和参数得方法对象 类型 getMethod只可拿到public修饰符的方法Method method = stuClass.getMethod("show", String.class);System.out.println(method);// 需要学生对象调用方法  该方法的参数值method.invoke(stuClass.newInstance(), "小明");// 下面是获得任意方法对象 方法有参数要指定参数Method method1 = stuClass.getDeclaredMethod("show");// 在Student类里面是私有的 在test1里面 利用反射想访问 得设置权限为truemethod1.setAccessible(true);Object result = method1.invoke(stuClass.newInstance());System.out.println("方法返回值为:" + result);System.out.println("=======");// study 方法对象Method method2 = stuClass.getDeclaredMethod("study", String.class);// 可以调用该非public有方法method2.setAccessible(true);// 方法对象调用方法Object study = method2.invoke(stuClass.newInstance(), "odorable");System.out.println(study);// 方法对象的修饰符 方法名 参数返回值System.out.println(Modifier.toString(method2.getModifiers()) + "\t" + method2.getName() + "\t" + method2.getReturnType());// 参数列表类型数组Class<?>[] ptypes = method2.getParameterTypes();for (Class<?> type : ptypes) {System.out.println(type);}System.out.println("============");// 获得当前类中所有方法对象Method[] methods = stuClass.getDeclaredMethods();for (Method me : methods) {System.out.println(me.getName());}	System.out.println("++++++++++++++++++");// 获得当前类一直到Object类中所有public方法对象 (Student Person Object)methods = stuClass.getMethods();for (Method me : methods) {System.out.println(me.getName());}} catch (Exception e) {e.printStackTrace();}}
}

更新…

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/420849.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

王灏:光音网络致力打造Wi-Fi大生态圈

光音网络&#xff0c;做的是本地网络综合服务。在中国&#xff0c;想把互联网做到覆盖延伸范围之外的最后100米&#xff0c;光音网络是当中一家&#xff0c;也是最坚持的一家。为千万家本地生活商户提供帮助&#xff0c;为数亿本地用户提供最佳的本地网络体验&#xff0c;这是光…

1005 继续(3n+1)猜想 (25分)

1005 继续(3n1)猜想 (25分) 卡拉兹(Callatz)猜想已经在1001中给出了描述。在这个题目里&#xff0c;情况稍微有些复杂。 当我们验证卡拉兹猜想的时候&#xff0c;为了避免重复计算&#xff0c;可以记录下递推过程中遇到的每一个数。例如对 n3 进行验证的时候&#xff0c;我们需…

利用反射对dao层进行重写

反射写一个通用的dao层1. 学了反射&#xff0c;就得学会搞事情2. 反射写dao具体实现1. 学了反射&#xff0c;就得学会搞事情 我想怎么对实体类操作&#xff0c;就对实体类操作 想实现通用的dao&#xff0c;要满足的条件&#xff1a; 实体类名与表名一样实体字段名与表字段名一…

Replication--查看未分发命令和预估所需时间

当复制有延迟时&#xff0c;我们可以使用复制监视器来查看各订阅的未分发命令书和预估所需时间&#xff0c;如下图&#xff1a; 但是当分发和订阅数比较多的时候&#xff0c;依次查看比较费时&#xff0c;我们可以使用sys.sp_replmonitorsubscriptionpendingcmds来查看&#xf…

1006 换个格式输出整数 (15分)

1006 换个格式输出整数 (15分) 让我们用字母 B 来表示“百”、字母 S 表示“十”&#xff0c;用 12…n 来表示不为零的个位数字 n&#xff08;<10&#xff09;&#xff0c;换个格式来输出任一个不超过 3 位的正整数。例如 234 应该被输出为 BBSSS1234&#xff0c;因为它有 2…

利用反射和xml配置文件手写一个小型的框架

通用的增删改查1. 利用xml配置实体类和数据库表名的映射关系2. 根据xml设计&#xff0c;用正确的数据结构映射类封装好xml信息3. 得到数据库连接前&#xff0c;读取xml信息&#xff0c;用map封装成映射数据4. 写dao时根据反射和map生成sql语句&#xff0c;拿到属性值测试为了解…

DPtoLP/LPtoDP 和 ScreenToClient/ClientToScreen

设备坐标&#xff08;Device Coordinate&#xff09;又称为物理坐标&#xff08;Physical Coordinate&#xff09;&#xff0c;是指输出设备上的坐标。通常将屏幕上的设备坐标称为屏幕坐标。设备坐标用对象距离窗口左上角的水平距离和垂直距离来指定对象的位置&#xff0c;是以…

前端学习(1126):递归求数学题

阶乘1*2*3.....*n <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </he…

1007 素数对猜想 (20分)

1007 素数对猜想 (20分) 让我们定义 ​​ 为&#xff1a;dnpn1−pnd_{n} p_{n1} - p_{n}dn​pn1​−pn​&#xff0c;其中pip_{i}pi​是第iii个素数。显然有d11d_{1} 1d1​1&#xff0c;且对于n>1n>1n>1有dnd_{n}dn​是偶数。“素数对猜想”认为“存在无穷多对相邻且…

Spring工作原理

一、 IoC(Inversion of control): 控制反转1、IoC&#xff1a;概念&#xff1a;控制权由对象本身转向容器&#xff1b;由容器根据配置文件去创建实例并创建各个实例之间的依赖关系核心&#xff1a;bean工厂&#xff1b;在Spring中&#xff0c;bean工厂创建的各个实例称作bean二…

前端学习(1127):递归求数学题2

斐波那契数列 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head>…

注解和反射实现dao层增删改查

注解和反射写dao1. 注解的使用2. 使用注解体现映射关系针对上一篇文章&#xff0c;使用xml映射文件和反射实现dao&#xff0c;提出了扩展功能&#xff0c;利用注解来体现实体类和表的映射关系本文是上一篇文章的扩展使用反射和xml实现dao 1. 注解的使用 什么是注解&#xff1…

1008 数组元素循环右移问题 (20分)

输入样例: 6 2 1 2 3 4 5 6 输出样例: 5 6 1 2 3 4 # -*- coding: utf-8 -*- import mathdef right_shift(lst, m):n len(lst)m m % nfor j in range(math.gcd(m, n)):temp lst[j]i jwhile (i - m) % n > j:lst[i] lst[(i - m) % n]i (i - m) % nlst[i] tempretur…

其它数据类型和Json的转化

1.ResultSet→Json public static String resultSetToJson(ResultSet rs) throws SQLException,JSONException { // json数组 JSONArray array new JSONArray(); // 获取列数 ResultSetMetaData metaData rs.getMetaData(); int columnCount metaData.getColumnCount(…

MVC分层开发模式

MVC 1. 什么是mvc开发模式2. 基于servlet手写mvc框架1. 什么是mvc开发模式 mvc不是一种技术&#xff0c;只是一种开发模式使用分层开发模式能在大型项目中&#xff0c;让开发人员更好的协同工作便于项目的维护和扩展 M: Model 模型层->数据库层->daoV: View 视图层->…

1009 说反话 (20分)

1009 说反话 (20分) 给定一句英语&#xff0c;要求你编写程序&#xff0c;将句中所有单词的顺序颠倒输出。 输入格式&#xff1a; 测试输入包含一个测试用例&#xff0c;在一行内给出总长度不超过 80 的字符串。字符串由若干单词和若干空格组成&#xff0c;其中单词是由英文字…

C#_uploadify_mvc_version

jQuery Uploadify在ASP.NET MVC3中的使用 1、Uploadify简介 Uploadify是基于jQuery的一种上传插件&#xff0c;支持多文件、带进度条显示上传&#xff0c;在项目开发中常被使用。 Uploadify官方网址&#xff1a;http://www.uploadify.com/ 2、ASP.NET MVC3中的使用Uploadify 搭…

1010 一元多项式求导 (25分)

输入样例: 3 4 -5 2 6 1 -2 0 输出样例: 12 3 -10 1 6 0 # -*- coding: utf-8 -*-def get_derivation(lst):length len(lst)idx 0while idx < length:if lst[idx 1] ! 0:lst[idx] * lst[idx 1]lst[idx 1] - 1else:lst[idx] 0idx 2return lstif __name__ __main__…

VS2012 发布网站步骤

VS2012中发布网站的方式与以往有了不同&#xff0c;前面的版本发布如图 而2012点publish的时候弹出框有所不同&#xff0c;这边需要新建一个profile名字随便起&#xff0c;发布的方式有好几种&#xff0c; 当然不同的方式配置不同&#xff0c;用的最多的就是files system了 选择…