反射的概念以及获取方法(一)
来源:互联网 发布:php垃圾回收机制 编辑:程序博客网 时间:2024/06/07 03:05
作者:叁念
反射的概念以及运用
声明:本文章所用代码结构如图所示,如果调试不成功,请按图片部署您的代码
其中Student类的代码如下:
package com.sannian;public class Student { // 四个属性:两个公开,一个私有,一个静态 public String name; public int age; private int money; public static int sint; // 公开 无参 public void introduce() { System.out.println("我是 " + name + ",今年" + age + "岁了"); } // 公开 一参 public void say(String str) { System.out.println(str); } // 公开 二参 public static int add(int num1, int num2) { return num1 + num2; } // 私有 无参 private void play() { System.out.println(name + "在玩游戏"); } public Student() { super(); } public Student(String name) { super(); this.name = name; } public Student(String name, int age) { super(); this.name = name; this.age = age; } @Override public String toString() { return "Student [name=" + name + ", age=" + age + ", money=" + money + "]"; }}
1.反射( reflect)的一些概念
反射指的是程序在运行时能够动态的获取任何类的所有信息
java的反射机制主要提供了以下功能:
1. 在运行时判断任意一个对象所属的类
2. 在运行时构造任意一个类的对象
3. 在运行时判断任意一个类锁具有的成员属性和方法
4. 在运行时调用任意一个对象的方法
举个例子: 1,2,3,4,5 - Integer 类型 "a","b","c","d" - String 类型 Integer, String - Class类型
2.反射的优缺点
// 优点: 1. 降低程序的耦合性,提高自适应能力 2. 提高了程序的灵活性和拓展性 3. 允许程序创建和控制任意类型的对象,无需提前硬编码 //缺点: 1. 反射会模型程序的内部逻辑, 程序员更希望在代码中直接看出程序的逻辑,反射绕过了源代码,可能会带来维护性问题 代码比直接对应的代码复杂许多 2. 性能问题,反射其实是一种解释型操作 用于字段和方法的介入时,要远远慢于使用直接的代码 因此反射主要用在对灵活度要求非常高的框架 普通程序不建议使用反射
3.Class类型 - 类的类型
获取类型对象
1. Class.forName(完整类名)
2. 类名.class
3. 对象.getClass()
常用方法
getName() //获取完整类名 getSimpleName() //获取简单类名 getDeclaredFields() //获取类中所有属性 getDeclaredMethods() //获取类中所有方法 getDeclaredConstructors() //获取类中所有构造器 newInstance() //实例化类的对象(公开的无参构造)
实际运用:
public class Demo { public static void main(String[] args) { /********************* 获取Class对象 ***********************/ /**1.通过类访问*/ Class<?> c1 = Student.class; System.out.println(c1); /**2.通过对象访问*/ Student stu = new Student(); Class<?> c2 = stu.getClass(); //true System.out.println(c1 == c2); /**通过完整类名访问*/ try { Class<?> c3 = Class.forName("com.sannian.Student"); //true System.out.println(c1 == c3); } catch (ClassNotFoundException e) { e.printStackTrace(); } }}
输出结果:
4.Field类型 - 属性的类型
常用方法 getName() 获得属性名 getType() 获得属性的类型 get(Object obj) 获取obj对象中的这个属性的值 set(Object obj, Object value) 将obj对象中这个属性的值设置为value setAccessible(true) 允许访问
实际运用:
public class Demo { public static void main(String[] args) { /******************* 获取字段 *************************/ /**getFields()访问所有字段*/ Class<?> c = Student.class; Field[] fields = c.getFields(); /**打印 : 修饰符 类型 变量名*/ for (int i = 0; i < fields.length; i++) { System.out.println(Modifier.toString(fields[i].getModifiers()) + " "+ fields[i].getType().getSimpleName() + " " + fields[i].getName()); } /**打印结果:*/ // public String name // public int age // public static int sint System.out.println("==============================="); /**和getFields()的区别?*/ Field[] fields2 = c.getDeclaredFields(); for (int i = 0; i < fields2.length; i++) { System.out.println(Modifier.toString(fields2[i].getModifiers()) + " "+ fields2[i].getType().getSimpleName() + " " + fields2[i].getName()); } /**打印结果:*/ // public String name // public int age // private int money //其中私有的也能访问到 // public static int sint }}
输出结果:
5.Method类型 - 方法的类型
常用方法 getName() 获取方法名称 getReturnType() 获取返回值类型 invoke(Object obj, Object... args) 调用obj对象的这个方法,参数列表为args getTypeParameters() 获取参数列表
实际运用:
public class Demo { public static void main(String[] args) { /******************* 获取方法 *************************/ Class<?> c4 = Student.class; Method[] methods = c4.getDeclaredMethods(); for (int i = 0; i < methods.length; i++) { /**访问修饰符*/ String modi = Modifier.toString(methods[i].getModifiers()); /**返回值*/ String returnType = methods[i].getReturnType().getSimpleName(); /**方法名*/ String mName = methods[i].getName(); /**参数列表*/ String list = "("; Class<?>[] parameterTypes = methods[i].getParameterTypes(); for (int j = 0; j < parameterTypes.length; j++) { list += parameterTypes[j].getSimpleName(); if(j < parameterTypes.length - 1) { list += ","; } } list += ")"; System.out.println(modi + " " + returnType + " " + mName + " " + list); }// public static int add (int,int)// public void introduce ()// public void say (String)// private void play () }}
输出结果:
阅读全文
0 0
- 反射的概念以及获取方法(一)
- java反射获取方法以及调用方法
- java反射获取方法以及调用方法
- Java反射(一):获取类的反射
- 聊聊C#反射概念(一)
- Java反射机制概念及构造方法的反射
- 图像语义分析学习(一):图像语义分割的概念与原理以及常用的方法
- 图像语义分析学习(一):图像语义分割的概念与原理以及常用的方法
- Test4_理解java反射机制的概念以及应用
- 通过反射获取类属性字段 以及 调用类方法
- 反射概念:获取class文件对象的三种方式
- 获取手机软件缓存的方法(反射)getPackageSizeInfo
- 反射中方法的获取和执行
- java反射---获取类的构造方法
- java反射---获取类的方法
- Java反射的获取方法浅析
- 通过反射获取方法返回的类型
- 反射机制--获取类的方法
- win10桌面美化
- form表单转换为json
- python包tqdm安装及入门
- 用C语言开发一个BT下载软件 (四) ------ 代码实现-1-种子文件解析模块
- springboot(一)启动和配置文件的读取
- 反射的概念以及获取方法(一)
- UGUI基础
- solr
- img标签 使用 margin : 0 auto 无效
- 数据库设计中一个矛盾:数据库外键,用还是不用?
- Essential Qt 第二十章 数据库
- Bugly 安卓ios符号表配置,手动上传
- codeforces 546e Soldier and Traveling
- 类加载时机与过程