java反射 Method

java反射 Method

  1. 获取字节码文件对象

    Class c = Class.forName("fieldtest.Student");
    
  2. 通过无参构造方法创建对象obj

    Constructor con = c.getConstructor();
    Object obj = con.newInstance();
    
  3. Method m1 = c.getMethod(“study”);获取study方法

  4. m1.invoke(obj);使用obj对象的m1方法

  5. 如果要用私有方法:

    Method m2 = c.getDeclaredMethod(“study”, String.class);

  6. 在使用invoke执行私有方法之前,要取消对这个方法的访问检查

    m2.setAccessible(true);

  7. m2.invoke(obj, “数学”);

一些api的内容:

public Method getMethod(String name,Class<?>... parameterTypes)
//第一个参数表示的方法名,第二个参数表示的是方法的参数的class类型
/*Returns a Method object that reflects the specified public member method of the class or interface represented by this Class object. 
The name parameter is a String specifying the simple name of the desired method. 
The parameterTypes parameter is an array of Class objects that identify the method's formal parameter types, in declared order. 
If parameterTypes is null, it is treated as if it were an empty array.*/ 
public Object invoke(Object obj,Object... args)
/*参数:
- obj:调用方法的对象
- args:为指定方法传递的参数值,是一个可变参数
- 返回值:为动态调用指定方法后的实际返回值
*/

例子:

package fieldtest;public class Student {// 成员变量public String name;// 公共private int age;// 私有// 构造方法public Student() {super();// TODO Auto-generated constructor stub}// 私有构造方法private Student(String name) {this.name = name;}public Student(String name, int age) {super();this.name = name;this.age = age;}// 成员方法(getXxx/setXxx)public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}// 成员方法public void study() {System.out.println("我爱学习java!");}// 私有private void study(String string) {System.out.println("我还爱学习" + string);}@Overridepublic String toString() {return "Student [name=" + name + ", age=" + age + "]";}
}
package fieldtest;import java.lang.reflect.Constructor;
import java.lang.reflect.Method;public class MethodDemo {public static void main(String[] args) throws Exception {// 获取字节码文件对象Class c = Class.forName("fieldtest.Student");// 获取所有的方法System.out.println("公共方法:");Method[] methods = c.getMethods(); // 获取自己的包括继承父亲的公共方法for (Method method : methods) {System.out.println(method);}System.out.println("所有方法:");Method[] methods1 = c.getDeclaredMethods(); // 获取自己的所有的方法for (Method method : methods1) {System.out.println(method);}Constructor con = c.getConstructor();Object obj = con.newInstance();// 获取单个方法并使用// public Method getMethod(String name,Class<?>... parameterTypes)// 第一个参数表示的方法名,第二个参数表示的是方法的参数的class类型Method m1 = c.getMethod("study");// public Object invoke(Object obj,Object... args)// 返回值是Object,第一个参数表示对象是谁,第二参数表示调用该方法的实际参数m1.invoke(obj); // 调用obj对象的m1方法System.out.println("----------");Method m2 = c.getDeclaredMethod("study", String.class);// NoSuchMethodException 访问私有方法 暴力访问m2.setAccessible(true);m2.invoke(obj, "数学");}
}/*
公共方法:
public java.lang.String fieldtest.Student.toString()
public java.lang.String fieldtest.Student.getName()
public void fieldtest.Student.setName(java.lang.String)
public void fieldtest.Student.setAge(int)
public int fieldtest.Student.getAge()
public void fieldtest.Student.study()
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
所有方法:
public java.lang.String fieldtest.Student.toString()
public java.lang.String fieldtest.Student.getName()
public void fieldtest.Student.setName(java.lang.String)
public void fieldtest.Student.setAge(int)
public int fieldtest.Student.getAge()
private void fieldtest.Student.study(java.lang.String)
public void fieldtest.Student.study()
我爱学习java!
----------
我还爱学习数学
*/

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

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

相关文章

axure 鼠标变成手,Axure教程|鼠标移入移出自动显示与隐藏三级菜单

前几天因工作需要做一个鼠标移入显示隐藏菜单&#xff0c;鼠标移出自动隐藏菜单&#xff0c;做的时候觉得没有什么问题&#xff0c;做完后预览就发现一个很严重的问题&#xff0c;就是鼠标移出一级菜单向二级菜单时二级菜单不显示&#xff0c;或者二级菜单显示三级菜单不显示。…

java与平台无关的原因

Java字节码 Java源程序&#xff08;.java&#xff09;要先编译成与平台无关的字节码文件(.class)&#xff0c;然后字节码文件再解释成机器码运行。解释是通过Java虚拟机来执行的。 java要运行要经过如下步骤 ① Java源文件—->编译器&#xff08;工具&#xff09;—->…

php websocket应用实例,php使用websocket示例详解

下面我画了一个图演示 client 和 server 之间建立 websocket 连接时握手部分&#xff0c;这个部分在 node 中可以十分轻松的完成&#xff0c;因为 node 提供的 net 模块已经对 socket 套接字做了封装处理&#xff0c;开发者使用的时候只需要考虑数据的交互而不用处理连接的建立…

Java集合 Collection

Jdk提供了一些特殊的类&#xff0c;用来保存数量不确定的对象&#xff0c;存储任意类型对象&#xff0c;长度可变。这些类统称为集合。 集合类位于Java.util包中&#xff0c;按存储结构分为Collection单列集合和Map双列集合。 Collection是单列集合的根接口&#xff0c;有两个…

java basic data type,java基本数据类型--Basic Datatypes

Variables are nothing but reserved memory locations to store values. This means that when you create a variable you reserve some space in the memory.---说的好有道理Based on the data type of a variable, the operating system allocates memory and decides what…

Java final修饰符的作用,Java中的final修饰符

1.什么时候可以选择final修饰符如果想让一个类不被其他类继承&#xff0c;不允许在有子类&#xff0c;这时候就要考虑用到final来修饰。2.用final修饰的类首先大家要明白&#xff0c;用final修饰的类是不能被继承的&#xff0c;下面来看一个错误案例。eg&#xff1a;final clas…

Java基础 HashMap的添加 修改 遍历 Map.Entry Map.entrySet()的使用及实例

Java Map Map中不能包含相同的键&#xff0c;每个键只能映射一个值。 HashMap&#xff1a;并不能保证它的元素的顺序&#xff0c;元素加入散列映射的顺序并不一定是它们被迭代方法读出的顺序。 Map.Entry Map.Entry 是Map中的一个接口&#xff0c;他的用途是表示一个映射项…

adminer.php下载,Adminer.php

Adminer.php就是原来的phpMinAdmin&#xff0c;这是用PHP编写的数据库管理工具&#xff0c;支持mysql、mariadb、postgresql、sqlite、MS SQL、Oracle等多种数据库&#xff0c;虽然是一个源码&#xff0c;但是可以使用用户们和密码直接连接到数据库的服务器&#xff0c;既可以对…

windows下如何在命令行里切换到任意目录

切换到C盘中的某个文件夹&#xff0c;比如AppData&#xff0c;可以执行命令cd AppData; 但如果想切换到D盘&#xff0c;输入cd d:是不行的; 如果我们要切换盘符的目录&#xff0c;正确的用法是在cd 和路径中间 增加一个“/d”&#xff0c;如cd /d d: 也可以不用cd指令&#x…

Java基础 系统注解 @Override @Deprecated @SuppressWarnings 使用的方法及原因

Java 系统注解 为什么用&#xff1f;&#xff1a; 好处&#xff1a;使用系统定义的注解&#xff0c;可以在编译时对程序进行检查。 注解用在包、类、字段、方法、局部变量、方法参数等的前面&#xff0c;对这些元素进行说明和注释。 Override Override用来修饰一个方法&am…

java二维数组排序先行后列,数组知识点归纳

◆◆◆一、理解一维数组的定义和应用&#xff0c;了解二维数组和控件数组&#xff1b;1、数组的概念&#xff1a;数组并不是一种数据类型&#xff0c;而是一组相同类型数据的集合。用一个统一的名字(数组名)代表逻辑上相关的一批数据&#xff0c;每个元素用下标变量来区分&…

Java 使用反射处理注解

Java 使用反射处理注解 自定义注解的格式&#xff1a; [public|final] interface 注解名//interface 表明&#xff1a;这是一个自定义注解 {注解元素//注解元素 是无参数的方法 }// 注解元素的格式&#xff1a; 数据类型 注解元素名() [default 默认值]例子&#xff1a; //自…

php面试宝典1000题,【PHP面试宝典1000题】HTTP中的请求头(深圳小美网络科技)

(1)通作一新求抖直微圈用信息头即址工框按都不他移据流。果原箭近第作架量是能用于请求消息中,也能用于响应信息中,但与被传输的实体内容没有关系的信息头,如Data,Pra分浏代刚的学过互解久点维数数请曾房总题屏断果如以气。泉公一实切式时带近享览码开时会进。,后&#xff0c;护…

java基础 通过继承Thread类和实现Runnable接口创建线程

java 创建线程 Java中&#xff0c;线程也是一种对象&#xff0c;但不是任何对象都可以成为线程。 只有实现了Runnable接口或继承了Thread类的对象才能成为线程。 继承Thread类 //格式&#xff1a; class 类名 extends Thread//从Thread类扩展出子类 {属性方法修饰符 run(){…

php求链表中位数,先给伸手党的php链表遍历求和

问题给出两个 非空 的链表用来表示两个非负的整数。其中&#xff0c;它们各自的位数是按照 逆序 的方式存储的&#xff0c;并且它们的每个节点只能存储 一位 数字。如果&#xff0c;我们将这两个数相加起来&#xff0c;则会返回一个新的链表来表示它们的和。您可以假设除了数字…

Java基础 线程同步

线程的同步&#xff1a;在编程过程中&#xff0c;为了防止多线程访问共享资源时发生冲突&#xff0c;Java提供了线程同步机制。所谓同步&#xff0c;就是指一个线程等待另一个线程操作完再继续的情况。 线程安全&#xff1a;一个类很好地同步以保护它的数据&#xff0c;这个类…

c++primer 3.2,3.3练习题

文章目录3.2.2 string 对象上的操作3.2.3 处理string对象中的字符3.3.2 向vector对象中添加元素3.3.3其他vector操作练习题涉及到代码的部分。3.2.2 string 对象上的操作 3.2 //一次输入一整行 #include<string> #include<iostream> using namespace std;int mai…

c++primer 3.4练习题

文章目录3.4 迭代器介绍3.4.1 使用迭代器3.4.2 迭代器运算3.4 迭代器介绍 3.4.1 使用迭代器 3.21 #include<vector> #include<iostream> #include<string> using namespace std;int main(){vector<int> v1;vector<int> v2(10);vector<int&…

嵌入式nosql php,NoSQL 嵌入式数据库NeDB示例

在nw.js一直无法配置sqlite3数据库&#xff0c;所以一直使用web sql数据库&#xff0c;不过还原之类的操作异常麻烦&#xff0c;打算使用NeDB数据库&#xff0c;非关系型数据库的扩展性很适合数据结构不确定性的nw.js项目。在Capacitor或cordova打包APP使用需引用&#xff1a;n…

logisim无法打开解决办法

打开报错&#xff1a;the registry refers to a nonexistent java Runtime Environment installation or the runtime is corrupted. 我明明装了1.8的jdk&#xff0c;环境变量也配置好了。但是还显示没有jdk环境。 解决办法&#xff1a; 命令行输入&#xff1a; d:cd D:\lo…