java invoke(转摘)

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的以及动态调用对象的方法的功能称为java语言的反射机制。
Java反射机制主要提供了以下功能:在运行时判定任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判定任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。

package com.java.jvm;

import java.lang.reflect.*;

class InvokeTest {
 public static void main(String[] args) {
 try {
 Class c = Class.forName("com.java.jvm.User");
 Object o = c.newInstance();
 Method m = c.getMethod("getName", null);
 Object ret = m.invoke(o, null);
 System.out.println( "com.java.jvm.User.getName() = " + ret);

 m = c.getMethod("setName", new Class[]{String.class});
 ret = m.invoke(o, new Object[]{"shengjian"});
 System.out.println( "com.java.jvm.User.setName() = " + ret);

 m = c.getMethod("getName", null);
 ret = m.invoke(o, null);
 System.out.println( "com.java.jvm.User.getName() = " + ret);

 //静态方法的调用
 m = c.getMethod("getUserName", new Class[]{String.class});
 ret = m.invoke(null, "fuwang");
 System.out.println( "com.java.jvm.User.getUserName() = " + ret);

 } catch (ClassNotFoundException ex) {
 System.out.println("找不到此类别");
 } catch (NoSuchMethodException ex) {
 System.out.println("此方法不存在");
 } catch (IllegalAccessException ex) {
 System.out.println("没有权限调用此方法");
 } catch (InvocationTargetException ex) {
 System.out.println("调用此方法时发生下列例外:\n" + ex.getTargetException());
 } catch (IllegalArgumentException e) {
 e.printStackTrace();
 } catch (InstantiationException e) {
 e.printStackTrace();
 }
 }
}

c.getMethod("getName", null)返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法。name 参数是一个 String,用于指定所需方法的简称。parameterTypes 参数是按声明顺序标识该方法形参类型的 Class 对象的一个数组。如果 parameterTypes 为 null,则按空数组处理。

name - 方法名 parameterTypes - 参数列表

Method 提供关于类或接口上单独某个方法(以及如何访问该方法)的信息。所反映的方法可能是类方法或实例方法(包括抽象方法)。

invoke()

对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。个别参数被自动解包,以便与基本形参相匹配,基本参数和引用参数都随需服从方法调用转换。

如果底层方法是静态的,那么可以忽略指定的 obj 参数。该参数可以为 null。

如果底层方法所需的形参数为 0,则所提供的 args 数组长度可以为 0 或 null。

如果底层方法是实例方法,则使用动态方法查找来调用它,这一点记录在 Java Language Specification, Second Edition 的第 15.12.4.4 节中;在发生基于目标对象的运行时类型的重写时更应该这样做。

如果底层方法是静态的,并且尚未初始化声明此方法的类,则会将其初始化。

如果方法正常完成,则将该方法返回的值返回给调用者;如果该值为基本类型,则首先适当地将其包装在对象中。但是,如果该值的类型为一组基本类型,则数组元素不 被包装在对象中;换句话说,将返回基本类型的数组。如果底层方法返回类型为 void,则该调用返回 null。

obj - 从中调用底层方法的对象args - 用于方法调用的参数。

User代码:

package com.java.jvm;

public class User {

	static{
		System.out.println("static ---");
	}

	public User(){
		System.out.println("name="+name);
		name="xiaotian";
	}

	private String name;
	private Integer age;
	private String address;

	public static String getUserName(String name){
		return name;
	}
	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 getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	@Override
	public String toString() {
		return "User [name=" + name + ", age=" + age + ", address=" + address
				+ "]";
	}

}
时间: 2024-10-26 09:22:43

java invoke(转摘)的相关文章

浅析Java线程的正确停止

线程错误终止之destroy与stop方法 记得以前初学Java的时候,由于缺少对锁.同步.异步等这些线程的知识,想当然的以为destroy与stop方法都能正确的停止Java线程的执行.但是,后来随着工作的积累,以及对线程安全的一些理解,慢慢认识到这两个方法是有问题的,并且这两方法也早已在java doc上被指名是弃用的. destroy()这个方法其实根本没干什么事情,只是抛出了一个NoSuchMethodError,所以说该方法无法终止线程,因此不能望文生意: /** * Throws {

Java中 BigInteger 的常用方法与注意事项

有时处理数字范围较大的数字相对麻烦,但有了BigInteger就可以完美解决,BigInteger具体的范围到底有多大,我之前查找了下,说是理论无穷大,看内存的大小(只供参考) 本文主摘: int 与 BigInteger之间的相互转化方法 使用BigInteger时的注意事项 BigInteger的常用方法 主摘1: 1 import java.math.*; 2 public class Day1{ 3 public static void main(String[] args){ 4 //

JNI/NDK开发指南(十一)——JNI异常处理

转载请注明出处:http://blog.csdn.net/xyang81/article/details/45770551 异常简介 异常,显而意见就是程序在运行期间没有按照正常的程序逻辑执行,在执行过程当中出现了某种错误,导致程序崩溃.在Java中异常分为运行时异常(RuntimeException)和编译时异常,在程序中有可能运行期间发生异常的逻辑我们会用try-catch-来处理,如果没有处理的话,在运行期间发生异常就会导致程序奔溃.而编译时异常是在编译期间就必须处理的.本章主要介绍运行时

MessageDigest的功能及用法

MessageDigest 类为应用程序提供信息摘要算法的功能,如 MD5 或 SHA 算法.信息摘要是安全的单向哈希函数,它接收任意大小的数据,并输出固定长度的哈希值. MessageDigest 对象开始被初始化.该对象通过使用 update()方法处理数据.任何时候都可以调用 reset()方法重置摘要.一旦所有需要更新的数据都已经被更新了,应该调用digest() 方法之一完成哈希计算. 对于给定数量的更新数据,digest 方法只能被调用一次.在调用 digest 之后,Message

ofbiz进击 个人遇到的奇葩问题汇总。

在本人做退货单生成的时候,因为考虑到要控制通过java类方法去调用 service服务可以方便给出提示消息,所以专门新建了一个java类,然后去重新请求request请求,下面为Java类的代码 1 public static String confirmReturnOrder(HttpServletRequest request, 2 HttpServletResponse response) { 3 String responseString = "error"; 4 try {

Ambari Hive 无法正常查询 问题分析处理

1.今天遇到一个错误,在连接到hive之后,无法执行任何命令. $ beeline -u "jdbc:hive2://hostname.domain.cn:10000/default;principal=hive/[email protected];" Connecting to jdbc:hive2://hostname.domain.cn:10000/default;principal=hive/[email protected]; Connected to: Apache Hiv

hive报错: Specified key was too long; max key length is 767 bytes

DataNucleus.Datastore (Log4JLogger.java:error(115)) - An exception was thrown while adding/validating class(es) : Specified key was too long; max key length is 767 bytescom.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Specified key was too

JAVA深入研究——Method的Invoke方法。

在写代码的时候,发现从父类class通过getDeclaredMethod获取的Method可以调用子类的对象,而子类改写了这个方法,从子类class通过getDeclaredMethod也能获取到Method,这时去调用父类的对象也会报错.虽然这是很符合多态的现象,也符合java的动态绑定规范,但还是想弄懂java是如何实现的,就学习了下Method的源代码. Method的invoke方法 1.先检查 AccessibleObject的override属性是否为true. Accessibl

java动态代理中的invoke方法是如何被自动调用的

转载:http://www.shangxueba.com/jingyan/1853835.html 一.动态代理与静态代理的区别.(1)Proxy类的代码被固定下来,不会因为业务的逐渐庞大而庞大:(2)可以实现AOP编程,这是静态代理无法实现的:(3)解耦,如果用在web业务下,可以实现数据层和业务层的分离.(4)动态代理的优势就是实现无侵入式的代码扩展. 静态代理这个模式本身有个大问题,如果类方法数量越来越多的时候,代理类的代码量是十分庞大的.所以引入动态代理来解决此类问题 二.动态代理 Ja