【反射之Method】如何获取字节码对象中的方法

■获取字节码对象的方法有两种

  第一种:使用字节码对象获取所有的方法(只能获取公有的方法,而不能获取私有/受保护的方法)

语法:

Class.getMethods()

示例:

Method[] methods = personClass.getMethods();

  第二种:使用字节码对象获取对象指定的方法,其参数:1.方法名;2.传入方法的参数类型加上“.class”

语法:

Class.getMethod(String name, Class<?>... parameterTypes)

示例:

Method setNameMethod = personClass.getMethod("setName", String.class);

■如何调用方法

  调用方法,参数:1.对象(必须明确是哪个对象调用方法); 2.传入方法中的参数

语法:

Method.invoke(Object obj, Object... args)

示例:

setNameMethod.invoke(p, "寒冰雪");

■如何调用私有构造器呢

  如何能让对象正常调用私有构造器呢?可以让获取到的私有构造器调用setAccessible(Boolean flag),该方法默认是false,即不忽略检查方法的修饰权限,true则表示忽略检查方法的修饰权限。将其设置为true即可正常调用了
语法:

setAccessible(boolean flag)

示例:

Constructor<?> constructor2 = personClass.getDeclaredConstructor(int.class);
constructor2.setAccessible(true);
Object p2 = constructor2.newInstance(23);

注:

  若要使用私有方法,一定要先调用getDeclaredMethod()方法获取到该私有方法(调用getMethod()方法只能获取到公共的方法,而调用getDeclaredMethod()既能获取到公共的,也能获取到私有的和受保护的方法),而后再调用setAccessible()方法。

 1 package reflect_method;
 2
 3 import java.lang.reflect.Constructor;
 4 import java.lang.reflect.InvocationTargetException;
 5 import java.lang.reflect.Method;
 6
 7 public class MethodDemo {
 8
 9     public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
10         Class<?> personClass = Class.forName("reflect.Person");
11         Constructor<?> constructor = personClass.getConstructor(String.class, int.class);
12
13         Object p = constructor.newInstance("周娟娟", 23);
14
15         // 使用字节码对象获取所有的方法(只能获取公有的方法,而不能获取私有/受保护的方法)
16         Method[] methods = personClass.getMethods();
17         for (Method method : methods) {
18             System.out.println(method);
19         }
20
21         // 使用字节码对象获取对象指定的方法,其参数:1.方法名;2.传入方法的参数类型加上.class
22         Method setNameMethod = personClass.getMethod("setName", String.class);
23
24         // 调用方法,参数:1.对象(必须明确是哪个对象调用方法); 2.传入方法中的参数
25         setNameMethod.invoke(p, "寒冰雪");
26         System.out.println(p);
27
28         Constructor<?> constructor2 = personClass.getDeclaredConstructor(int.class);
29         constructor2.setAccessible(true);
30         Object p2 = constructor2.newInstance(23);
31         System.out.println(p2);
32
33         Method getAgeMethod = personClass.getDeclaredMethod("getAge");
34         getAgeMethod.setAccessible(true);
35
36         Object age = getAgeMethod.invoke(p2);
37         System.out.println(age);
38
39
40     }
41
42 }
时间: 2024-12-16 17:25:23

【反射之Method】如何获取字节码对象中的方法的相关文章

java学习--基础知识进阶第十三天--反射机制的概述和字节码对象的获取方式、反射操作构造方法、成员方法、成员属性、JavaBean的概述&amp;BeanUtils的使用、自定义BeanUtils工具类

今日内容介绍 u 反射机制的概述和字节码对象的获取方式 u 反射操作构造方法.成员方法.成员属性 u JavaBean的概述&BeanUtils的使用 u 自定义BeanUtils工具类 第1章 反射机制概述.字节码对象的获取方式.反射操作构造方法.成员方法.成员属性 1.1 反射机制的概述和字节码对象的获取方式 1.1.1 反射介绍 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法        这种动态获取的以及动

反射机制的概述和字节码对象的获取方式

1.1.1 反射介绍JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法对于任意一个对象,都能够调用它的任意一个方法这种动态获取的以及动态调用对象的方法的功能称为java语言的反射机制. 简单来说, 就可以把.class文件比做动物的尸体, 而反射技术就是对尸体的一种解剖.通过反射技术, 我们可以拿到该字节码文件中所有的东西, 例如成员变量, 成员方法, 构造方法, 而且还包括私有1.1.2 字节码文件获取的三种方式 对象名.getCalss(); // 次方法来自于

内置对象Array的原型对象中添加方法

// //倒序字符串的方法String.prototype.myReverse=function () { for(var i=this.length-1;i>=0;i--){ console.log(this[i]); }};var str="1234567";str.myReverse(); //为内置对象Array的原型对象中添加方法Array.prototype.mySort=function () { for(var i=0;i<this.length-1;i++

java 27 - 2 反射之 反射的概述以及获取Class文件对象的方式

反射: JAVA语言的反射机制: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法: 对于任意一个对象,都能够调用它的任意一个方法和属性: 这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 如何解剖一个类: 要想解剖一个类,必须先要获取到该类的字节码文件对象. 而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象. 通俗的来说: 反射:就是通过class文件对象,去使用该文件中的成员变量,构造方法

获取字节码的三种方式

获取java字节码有三种方式,假设要获得的字节码的类为requireClass 1 使用类的静态方法 Class classOne = requireClass.class; 2 使用类对象的getClass方法 Class classTwo = requireClassInstance.getClass; 3 使用Class类的静态方法 Class.forName Class classThree = Class.forName("类的全路径名"); 在反射的实际应用中通常采用第三种

spring中获取dao或对象中方法的实例化对象

spring中获取dao的中方法的实例化对象: 1 //获取应用上下文对象 2 ApplicationContext ctx = new ClassPathXmlApplicationContext("spring-config.xml"); 3 //例子:获取dicDao实例 4 dicDao = ctx.getBean(IDicDao.class); //例子2:获取MemcacheAccess的实例: 5 memcachedAccess = ctx.getBean(Memcach

request,reponse对象中的方法

1.request对象 客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出响应.它是HttpServletRequest类的实例. 序号 方 法 说 明 1   object getAttribute(String name) 返回指定属性的属性值 2   Enumeration getAttributeNames() 返回所有可用属性名的枚举 3   String getCharacterEncoding() 返回字符编码方式 4   int getConten

java反射1--产生Class类的实例化对象三个方法

首先每一个类在实例化的时候都会产生一个.class文件.而Class对象既是将.class文件读入内存时,为它创建一个Class对象. 反射就是对Class对象进行操作. 1 package reflect.vo; 2 3 /** 4 * @author guohao 5 * java测试类Student 6 */ 7 public class Student { 8 private String name; 9 private int age; 10 private float score;

Js与Jq 获取浏览器和对象值的方法

JS and Jquery 都能获取页面元素的宽度,高度和相对位移等数值,那他们之间能相互转换或替代吗,写法又有哪些差异呢?本文将详细为你介绍. 1.Js获取浏览器高度和宽度document.documentElement.clientWidth ==> 浏览器可见区域宽度 document.documentElement.clientHeight ==> 浏览器可见区域高度 document.body.clientWidth ==> BODY对象宽度 document.body.cli