使用反射获取类中的方法:

1):获取方法所在类的字节码对象.

2):获取方法.

------------------------------------------------------------------------

Class类中常用方法:

publicMethod[] getMethods():获取包括自身和继承过来的所有的public方法

publicMethod[] getDeclaredMethods():获取自身类中所有的方法(不包括继承的,和访问权限无关)

publicMethod getMethod(StringmethodName,

Class<?>...parameterTypes):表示调用指定的一个公共的方法(包括继承的)

参数:

methodName: 表示被调用方法的名字

parameterTypes:表示被调用方法的参数的Class类型如String.class

publicMethod getDeclaredMethod(String name,

Class<?>... parameterTypes):表示调用指定的一个本类中的方法(不包括继承的)

参数:

methodName: 表示被调用方法的名字

parameterTypes:表示被调用方法的参数的Class类型如String.class

代码:

     System.out.println("-----------使用反射调用方法----------------");Class clzz = Main.class;Constructor<Main> conm = clzz.getConstructor();Main instance = conm.newInstance();//获取instance对象来调用方法instance.getOne();//获取所有的方法Method[] methods = clzz.getMethods();for (Method method : methods) {//获取类中方法的全名(eg:public com.test.Main())System.out.println(method);}

使用反射调用方法:

1):获取方法所在类的字节码对象.

2):获取方法对象.

3):使用反射调用方法.

------------------------------------------------------------------------

如何使用反射调用一个方法:

在Method类中有方法:

publicObject invoke(Object obj,Object... args):表示调用当前Method所表示的方法

参数:

obj: 表示被调用方法底层所属对象

Method m =clz.getMethod("sayHi",String.class);

args:表示调用方法是传递的实际参数

返回:

底层方法的返回结果

调用私有方法:

在调用私有方法之前:应该设置该方法为可访问的

又因为Method是AccessibleObject子类,所以Method中具有该方法.

sayGoodByeMethod.setAccessible(true);

     System.out.println("-----------使用反射调用方法----------------");Class<Main> zlz = Main.class;//调用public类型方法System.out.println("public类型方法");Method method = zlz.getMethod("getName",String.class);//第一个参数为方法名、第二个为方法中参数类型Object invoke = method.invoke(zlz.newInstance(),"weijie");System.out.println(invoke);//调用private类型方法System.out.println("private类型方法");Method method2 = zlz.getDeclaredMethod("getAge",int.class);Object invoke2 = method2.invoke(zlz.newInstance(),22);

Output:

-----------使用反射调用方法----------------
public类型方法
我是Main类无参的构造器
weijie
private类型方法
我是Main类无参的构造器
Age:22

练习代码保存:

package com.test;import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Arrays;
import java.util.Date;
import java.util.Scanner;public class Main {//获取指定的一个构造器public Main(){System.out.println("我是Main类无参的构造器");}public Main(int num){System.out.println(num);}private Main(final String statement){System.out.println("我是带有一个String类型的参数的构造器");}private Main(String str, int num){System.out.println("我是带有两个参数的构造器");}public static String getName(String str){return str;}private static void getAge(int age){System.out.println("Age:"+age);}private static void getAll(){//1:获取构造器所在类的字节码对象Class<Main> clz = Main.class;//2:获取clz对象中所有的构造器Constructor<?>[] cs = clz.getConstructors();System.out.println(cs.length);for (Constructor<?> c : cs) {System.out.println(c);}cs = clz.getDeclaredConstructors();System.out.println(cs.length);for(Constructor<?> c : cs){System.out.println(c);}}private static void getOne() throws NoSuchMethodException, SecurityException{//1:获取构造器所在类的字节码对象Class<Main> clz = Main.class;//2:获取clz对象中所有的构造器//需求1:获取public Main()Constructor<Main> con = clz.getConstructor();System.out.println(con);//需求2:获取public Main(String statement)con = clz.getDeclaredConstructor(String.class);System.out.println(con);//需求3:获取private Main(String str, int num)con = clz.getDeclaredConstructor(String.class, int.class);System.out.println(con);}public static void main(String[] args) throws Exception {System.out.println("---------类的实例------------------");//需求1:获取java.util.Date类的字节码对象//方式1:使用class属性Class<java.util.Date> clz1 =java.util.Date.class;//方式2:通过对象的getClass方法获取,getClass是Object类中的方法java.util.Date date = new java.util.Date();Class<?> clz2 = date.getClass();//方式3:通过Class类中的静态方法foeName(String className)Class<?> clz3 = Class.forName("java.util.Date");System.out.println(clz1+"\n"+clz2+"\n"+clz3+"\n");System.out.println("----------获取类的构造器-----------------");getOne();System.out.println("-----------获取类的所有的构造器----------------");getAll();System.out.println("-----------反射调用构造器创建对象----------------");//1:获取构造器所在类的字节码对象Class<Main> clz = Main.class;//2:获取clz对象中所有的构造器Constructor<Main> con = clz.getDeclaredConstructor(String.class);//3.使用反射创建对象//由于main(String..)为私有的因此,设置访问权限con.setAccessible(true);String str = "hello";con.newInstance(str);System.out.println("-----------使用反射获取类中的方法----------------");Class clzz = Main.class;Constructor<Main> conm = clzz.getConstructor();Main instance = conm.newInstance();//获取instance对象来调用方法instance.getOne();//获取所有的方法Method[] methods = clzz.getMethods();for (Method method : methods) {//获取类中方法的全名(eg:public com.test.Main())System.out.println(method);}System.out.println("-----------使用反射调用方法----------------");Class<Main> zlz = Main.class;//调用public类型方法System.out.println("public类型方法");Method method = zlz.getMethod("getName",String.class);//第一个参数为方法名、第二个为方法中参数类型Object invoke = method.invoke(zlz.newInstance(),"weijie");System.out.println(invoke);//调用private类型方法System.out.println("private类型方法");Method method2 = zlz.getDeclaredMethod("getAge",int.class);Object invoke2 = method2.invoke(zlz.newInstance(),22);}
}

在Java反射中Field用于获取某个类的属性或该属性的属性值

一:如何通过Field反射获取类的属性

Field提供如下几种方法:

:1:Class.getDeclaredField(String name);

返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段(包括私有成员)。

2:Class.getDeclaredFields();

返回 Field 对象的一个数组,该数组包含此 Class 对象所表示的类或接口所声明的所有字段(包括私有成员)。

3:Class.getField(String name);

返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。

4:Class.getFields();

返回一个包含某些 Field 对象的数组,该数组包含此 Class 对象所表示的类或接口的所有可访问公共字段。

package producer;import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.locks.ReentrantLock;
import java.util.regex.Matcher;
import java.util.regex.Pattern;class Person
{  public String name;  private Integer age;  private String sex;  //省略所有属性的set、get方法  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;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}
}
public class Main {public static void main(String[] args) throws Exception, SecurityException { Person person = new Person();// 通过Class.getDeclaredField(String name)获取类或接口的指定已声明字段。Field f1 = person.getClass().getDeclaredField("name");System.out.println("-----Class.getDeclaredField(String name)用法-------");System.out.println(f1);System.out.println("-----Class.getDeclaredFields()用法-------");// 通过Class.getDeclaredFields()获取类或接口的指定已声明字段。Field[] f2 = person.getClass().getDeclaredFields();for (Field field : f2) {System.out.println(field);}System.out.println("-----Class.getField(String name)用法-------");// 通过Class.getField(String name)返回一个类或接口的指定公共成员字段,私有成员报错。Field f3 = person.getClass().getField("name");//给属性赋值f3.set(person, "hello java");System.out.println(f3);//获取属性值System.out.println(f3.get(person));// 如果获取age属性(私有成员) 则会报错// Field f3=person.getClass().getField("name");System.out.println("-----Class.getFields()用法-------");// 通过Class.getField(),返回 Class 对象所表示的类或接口的所有可访问公共字段。Field[] f4 = person.getClass().getFields();for (Field fields : f4) {// 因为只有name属性为共有,因此只能遍历出name属性System.out.println(fields);}}
}

参考博客:https://blog.csdn.net/vipmao/article/details/51638547

java中如何使用反射调用方法以及获得类中的属性相关推荐

  1. Java反射-调用方法

    调用方法与访问字段类似, 通过Class实例的方法获得Method实例 getMethod().getDeclaredMethod().getMethods().getDeclaredMethods( ...

  2. 关于反射调用方法的一个log

    [Loaded sun.reflect.GeneratedMethodAccessor197 from __JVM_DefineClass__]  请问报这个是什么意思? 这是Sun实现的Java标准 ...

  3. .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)...

    大家都说反射耗性能,但是到底有多耗性能,哪些反射方法更耗性能:这些问题却没有统一的描述. 本文将用数据说明反射各个方法和替代方法的性能差异,并提供一些反射代码的编写建议.为了解决反射的性能问题,你可以 ...

  4. Java黑皮书课后题第10章:10.2(BMI类)将下面的新构造方法加入BMI类中

    Java黑皮书课后题第10章:10.2(BMI类)将下面的新构造方法加入BMI类中 题目 程序说明 题目槽点 代码:Test2_BMI.java 运行实例 题目 程序说明 Test2_BMI.java ...

  5. C# 使用反射调用方法_MethodInfo.Invoke方法

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  6. C# 使用反射调用方法(MethodInfo.Invoke方法)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  7. 学习Java的第五天 | 定义方法 | 引用数据类型——类 | 访问权限-修饰符 | 全局变量与局部变量 | toString | 构造方法 | 方法重载

    前面提到的,冒泡排序,二分查找,我们有时候写代码可能不止要查到一种数组的数据,这时候我们就很需要想循环那样的结构,来帮我们解决代码冗余的情况. 我们前面使用的main方法,是一个java程序的入口,我 ...

  8. python getitem方法理解_Python类中方法getitem和getattr详解

    1.getitem 方法 使用这个方法最大的印象就是调用对象的属性可以像字典取值一样使用中括号['key'] 使用中括号对对象中的属性进行取值.赋值或者删除时,会自动触发对应的__getitem__. ...

  9. IDEA中如何给含有main方法的普通类设置JVM参数

    问题描述:IDEA中如何给含有main方法的普通类设置JVM参数,并使其运行 解决方法: 第一步:找到并选中含有main方法的普通类,然后单击鼠标右键选择"Run 'xxx.main()' ...

最新文章

  1. 【c语言】转义字符的使用
  2. 计算机组成与结构实验箱,HQFC-B1计算机组成和数字电路实验箱
  3. 51nod 1103 N的倍数 思路:抽屉原理+前缀和
  4. 重学前端学习笔记(八)--JavaScript中的原型和类
  5. C++,Java编程中 标识符 常见命名约定
  6. MATLAB中,信号的频谱图该怎么绘制?横坐标如何标注出频率值?
  7. mysql线上问题之Lock wait timeout exceeded; try restarting transaction
  8. go去掉最后一个字符_Go:字符串操作
  9. CSS笔记-除了a标签外的hover属性的应用
  10. t–sql pl–sql_SQL Server性能疑难解答的DBA指南–第2部分–监视实用程序
  11. 给老外索要仿真代码信件
  12. html中blockquote标签,html中blockquote标签的使用方法
  13. boot版本是什么 cent os_确定 BootROM 或固件版本
  14. Windows编程 DirectInput 鼠标和键盘的输入
  15. 平面设计入门新手需看技巧
  16. 3D点云之PCL学习之路(一)
  17. linux中的execl函数使用
  18. 关键词(快排)刷词原理和方法
  19. conda查看版本包命令
  20. scala中case的用法

热门文章

  1. 对象引用 String引用 基本类型引用 差别
  2. 敏捷软件开发 12 原则
  3. mysql 索引 简书_MySQL 索引
  4. 关于HTML的盒子的一些小问题
  5. excel公式不自动计算_【纯干货】值得收藏的Excel日期计算公式!
  6. 黑苹果系统坏了如何恢复_黑苹果macOS系统U盘版/恢复版基础安装教程
  7. mysql-5.7.24初始化数据库_MySQL5.7.28 初始化数据库
  8. python 降维 聚类_比PCA降维更高级——(R/Python)t-SNE聚类算法实践指南
  9. row number函数 oracle,oracle函数 ROW_NUMBER()
  10. mysql share mode_mysql锁:mysql lock in share mode 和 select for update