`

java反射浅析(二)关于Method 方法测试

    博客分类:
  • java
 
阅读更多
上一篇博客中,大致了解了整个反射的机制。
这次主要是就反射的某些方法进行测试,以便更好的理解反射:
1.首相建立普通类:该类包括一些私有的方法和属性。
public class Tank {
	
	private  int x = 4;
	public  int y = 5;
	
	public Tank(int x, int y) {
		super();
		this.x = x;
		this.y = y;
	}
	
	public Tank(){
		
	}
	public int add(){
		
		return 4;
		
	}
	private void bdd(){
		
		System.out.println("私有方法步能访问哦 亲!!");
		
	}
	private  void cdd(int x,int y){
		
		System.out.println(" 亲!!");
		
	}

}


该类有熟悉:x,y 方法:add,bdd,cdd(在类声明的,其中bdd,cdd 为私有方法)
2.建立测试类Test,访问Tank类的信息。
package ReflectJava;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Test {

	
	public static void main(String[] args) throws InstantiationException, IllegalAccessException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException {

        Class t = Tank.class;      //得到Tank类的Class 对象
        Object o = t.newInstance();// 通过class 对象实实例化一个Tanke对象
        
       //-------------------Method 类的方法测试------------------------------
        
        Method[] methods = t.getDeclaredMethods();
     // getDeclaredMethods() 方法得到的是该类声明的方法,包括私有,公有方法
        
        Method[] methoods = t.getMethods();
       //getMethods() 方法得到 该类所有的公有方法
        System.out.println("-------通过getDeclaredMethods()得到方法------------");
        for(Method s: methods){
        	
        	System.out.println(s.getName());
        	
        }
        System.out.println("-------通过getMethods()得到方法------------");
        for(Method ss: methoods){
        	
        	
        	System.out.println(ss.getName());
        	
        }
         Method m1 = t.getDeclaredMethod("add");
         Method m2 = t.getMethod("bdd");
        
        // System.out.println(m2.invoke(o));
        System.out.println(m2.invoke(o));
        	
		//---------------------------------------------------------------
		
		

	}

}


测试结果:
 
-------通过getDeclaredMethods()得到方法------------
bdd
cdd
add
-------通过getMethods()得到方法------------
add
hashCode
getClass
wait
wait
wait
equals
toString
notify
notifyAll

通过测试类,明确
getMethods,getDeclareMethods,getMethod,getDeclareMethod 方法的区别:

// 返回方法数组
getMethods:返回该类的所有方法,但不包括私有方法
getDeclareMethods:返回该该类所有显示声明的方法,包括私有方法
// 返回特定方法
getMethod:返回该类的任何公有方法。
getDeclareMethod:返回该类的显示声明的公,私有方法。

总结: 只有getDeclareMethods,getDeclareMethod方法才能返回私有方法。
       其他的只能返回公有方法。
            
  也就是说对于返回明确的方法如:getMethod("方法名",Class[]{....}) 其方法名必须是公有的,否则程序运行时会报错。


关于方法参数设置问题:
public Method getMethod(String name,
                        Class<?>... parameterTypes)

如果要反射到public int add(int x,int y) 方法

则 对应参数设置为:
Method ss = getMethod("add",new Class[]{int.class,int.class});

例如 类  Tank t = new Tank();
调用该方法: ss.invoke(t,new Object[]{3,4});

注意:如果ss 为私有方法时,则调用ss.invoke方法时,运行时出现错误。
此时应该调用ss.setAccessible(true); 遏制jvm权限范围检查。
分享到:
评论

相关推荐

    Java 反射机制浅析

    4. **测试工具**:JUnit等测试框架使用反射来调用私有方法进行测试。 5. **动态代理**:Java的`java.lang.reflect.Proxy`类允许创建动态代理类,用于拦截方法调用,实现AOP(面向切面编程)。 然而,反射虽然强大,...

    java 声音技术浅析

    Java声音技术浅析 在Java世界里,多媒体技术的集成一直是开发者关注的焦点,其中声音技术尤为关键。本文将深入探讨Java对声音处理的支持,包括Applet中的声音播放、Java应用程序中的声音处理以及JavaX中Sound包的...

    Java内存分配浅析

    Java内存分配是Java编程中非常重要的概念,它涉及到程序运行时的数据存储和管理。Java程序在JVM(Java Virtual Machine,Java虚拟机)上运行,JVM作为一个平台无关的执行环境,负责Java程序的内存管理和执行。理解...

    技术浅析.pdf 知识领域 Javase javaee Java技术浅析 技术关键词 JAVA语言 编程技术框架 原理

    Java技术浅析 Java是一种广泛应用于企业级项目开发的编程语言,它具有强大的功能和灵活的特性,使其成为开发大型项目的首选语言。Java技术浅析主要介绍了Java语言的技术关键词、编程技术框架、原理等知识点。 一、...

    浅析Java 反射机制的用途和缺点

    "浅析Java 反射机制的用途和缺点" Java 反射机制是一种强大的技术,可以让应用程序做一些几乎不可能做到的事情。它可以让程序在运行时检测或修改程序行为,是 Java 语言中一个相对高级的特性。开发者可以使用反射...

    轻松学会c# 反射浅析原理及应用教程

    ### 轻松学会C# 反射浅析原理及应用教程 #### 一、C#反射概述 C#反射是一种强大的技术,它允许程序员在运行时获取类型的信息,并能够调用类型的方法或属性,甚至是那些私有的成员。反射机制在.NET框架中由多个类...

    Java中main()方法浅析.docx

    ### Java中main()方法浅析 #### 一、概述 在Java编程语言中,`main()`方法具有特殊的意义,它是所有Java应用程序的起点。当Java虚拟机(JVM)启动并加载了一个包含`main()`方法的类时,它会自动调用这个方法来开始...

    Java线程池浅析1

    }关于FutureTask这个类的实现,我在前面的JAVA LOCK代码浅析有讲过其实现原理,主要的思想就是关注任务完成与未完成的状态,任务提交线程get()结

    Java语言的方法参数浅析

    大多数程序设计语言具有传值调用和传引用调用的两种方法.通过对典型程序的研究与分析可以看出JAVA语言的参数传递总是传值调用的,但是对于基本类型的参数和对象类型的参数来说,参数传递的情况不完全相同.Java语言不能...

    java组件的浅析

    "Java组件的浅析" JavaBean是一种软件组件,它是一个Java类,定义了一系列get和set方法。JavaBean是为了简化jsp页面与后台数据的交互过程而产生的。使用JavaBean可以将数据封装在一个Bean对象中,然后将Bean对象...

    浅析Java设计模式【3】——代理.pdf

    ### 浅析Java设计模式【3】——代理 #### 一、代理模式概述 代理模式是一种行为型设计模式,主要用于在客户端与目标对象之间起到一个中介的作用,通过代理对象来控制对目标对象的访问。代理模式的核心在于它可以...

    深入浅析Java反射机制

    Java反射机制允许我们在运行时获取任何类的详细信息,包括类名、包名、父类、接口、字段(属性)和方法。例如,`Class&lt;?&gt; clazz = Class.forName("className")` 可以得到指定类的Class对象,进一步可以调用 `clazz....

    Java多态性浅析.pdf

    Java 多态性浅析 Java 多态性是面向对象技术的三大特性之一,它通过继承中的覆盖(动态多态性)和方法的重载(静态多态性)实现的。在Java中,多态性指的是一个名词可以有多个语义。 多态性的实现 Java 的多态性...

    Java语言中This关键字应用浅析

    Java语言中This关键字应用浅析,看完后帮助于JAVA中类的操作。

    浅析JAVA编程中异常处理的方法与技巧.pdf

    浅析JAVA编程中异常处理的方法与技巧.pdf

    浅析Java中的抽象类与抽象方法.pdf

    "浅析Java中的抽象类与抽象方法.pdf" 本文主要探讨了Java中的抽象类与抽象方法,并对信息系统审计工作进行了深入分析。首先,我们介绍了信息系统审计的内容,包括内部控制审计、软件硬件审计和计算机生命同期审计等...

    java 虚拟机原理浅析

    java 虚拟机原理浅析,希望大家来交流

    基于Java的Web开发技术浅析.pdf

    Java Server Pages (JSP) 技术。JSP 提供了一种更简便的方式来创建动态网页,它将内容的生成和显示分离开,使得开发者可以专注于业务逻辑而不必关心具体的页面展示。JSP 页面由静态HTML和嵌入其中的Java代码组成,...

Global site tag (gtag.js) - Google Analytics