`

测试java反射机制1

阅读更多
先定义一个Test类

public interface TestInterface {

public void say();


}


public  class subTest {

private int field0=50;
public  int field5=150;
protected  int field6=450;


public subTest() {

}
public subTest(String a) {

}
public void getField0(){
System.out.println("getField0");
}

private void getField5(){
System.out.println("getField5");
}
}

public class Test extends subTest implements TestInterface {

private int field1=100;

public int field2=200;

protected int field3=300;

int field4=400;

@Override
public void say() {
System.out.println("hello  saypublic");

}

public Test() {

// TODO Auto-generated constructor stub
}
private Test(String a) {

// TODO Auto-generated constructor stub
}
protected Test(int a,int b) {
System.out.println("a+b="+(a+b));
// TODO Auto-generated constructor stub
}
public Test(int f1) {
field1=f1;
// TODO Auto-generated constructor stub
System.out.println("f1="+f1);
}

protected void sayprotected(int a,int b) {
System.out.println("a="+a);
System.out.println("b="+b);
System.out.println("hello sayprotected");

}

private void sayprivate(){
System.out.println("sayprivate");
}

}

接是写一个测试mian方法

public class TestReflect {

/**
* @param args
* @throws NoSuchFieldException
* @throws SecurityException
*/
public static void main(String[] args) throws SecurityException, NoSuchFieldException {
// TODO Auto-generated method stub
try {
Class obj=Class.forName("reflect.Test");
Test test=(Test)obj.newInstance();
System.out.println(test.getClass().getClassLoader());
System.out.println(test.getClass().getInterfaces());
System.out.println(test.getClass().getConstructors());
//指定本身定义的字段(包括私有和共有)
System.out.println("-------指定本身定义的字段(包括私有和共有)----------");
System.out.println(test.getClass().getDeclaredField("field1"));//可以
System.out.println(test.getClass().getDeclaredField("field2"));//可以
System.out.println(test.getClass().getDeclaredField("field3"));//可以
System.out.println(test.getClass().getDeclaredField("field4"));//可以
//不是本身定义的字段,访问会出错
//System.out.println(test.getClass().getDeclaredField("field5"));//不可以
//System.out.println(test.getClass().getDeclaredField("field0"));//不可以
//System.out.println(test.getClass().getDeclaredField("field6"));//不可以
//指定类或接口中的公共成员字段
System.out.println("-------指定类或接口中的公共成员字段----------");
System.out.println(test.getClass().getField("field5"));//可以
//System.out.println(test.getClass().getField("field0"));//不可以
//System.out.println(test.getClass().getField("field6"));//不可以

//所有类或接口中的公共成员字段
System.out.println("-------所有类或接口中的公共成员字段----------");
Field field[]=test.getClass().getFields();
for(int i=0;i<field.length;i++){
System.out.println(field[i].toString());
}

//所有类的成员字段
System.out.println("-------所有类的成员字段----------");
field=test.getClass().getDeclaredFields();
for(int i=0;i<field.length;i++){
System.out.println(field[i].toString());
}

//所有类的方法
System.out.println("-------所有类的方法----------");
Method method[]=test.getClass().getDeclaredMethods();
for(int i=0;i<method.length;i++){
System.out.println(method[i].toString());
}

//所有类或接口的公共成员方法
System.out.println("-------所有类或接口的公共成员方法----------");
method=test.getClass().getMethods();
for(int i=0;i<method.length;i++){
System.out.println(method[i].toString());
}
//指定类或接口中的公共成员字段
System.out.println("-------指定类或接口中的公共成员方法----------");
try {
System.out.println(test.getClass().getMethod("say", null));
//System.out.println(test.getClass().getMethod("sayprotected", null));
//System.out.println(test.getClass().getMethod("sayprivate", null));
System.out.println(test.getClass().getMethod("getField0", null));
//System.out.println(test.getClass().getMethod("getField5", null));
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}//可以

//指定类方法
System.out.println("-------指定类方法----------");
try {
System.out.println(test.getClass().getDeclaredMethod("say", null));
System.out.println(test.getClass().getDeclaredMethod("sayprotected", new Class[]{int.class,int.class}));
System.out.println(test.getClass().getDeclaredMethod("sayprivate", null));
//System.out.println(test.getClass().getDeclaredMethod("getField0", null));
//System.out.println(test.getClass().getMethod("getField5", null));
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}//可以
System.out.println("-------getDeclaredConstructors构造方法----------");
Constructor con[]=test.getClass().getDeclaredConstructors();
for(int i=0;i<con.length;i++){
System.out.println(con[i].toString());
}
System.out.println("-------getConstructors构造方法----------");
con=test.getClass().getConstructors();
for(int i=0;i<con.length;i++){
System.out.println(con[i].toString());
}
System.out.println("-------getConstructors构造方法----------");
Class arrl[] = {};
Class arr2[] =new Class[]{int.class,int.class};
try {
System.out.println(test.getClass().getDeclaredConstructor(arrl));
        Object obj1;
try {
obj1 = test.getClass().getDeclaredConstructor(arrl).newInstance(arrl);
System.out.println("===" + obj1);
obj1 = test.getClass().getDeclaredConstructor(arr2).newInstance(new Integer[]{3,4});
obj1 = test.getClass().getDeclaredConstructor(arr2).newInstance(3,4);
System.out.println("===" + obj1);
Method m = obj1.getClass().getDeclaredMethod("sayprotected", new Class[]{int.class,int.class});
System.out.println("===" + m.getParameterTypes());
System.out.println("===" + m.getReturnType());
Object obj2 = m.invoke(obj1, new Integer[]{4,5});

} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}  
       
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}


运行结果如下:


sun.misc.Launcher$AppClassLoader@19821f
[Ljava.lang.Class;@61de33
[Ljava.lang.reflect.Constructor;@14318bb
-------指定本身定义的字段(包括私有和共有)----------
private int reflect.Test.field1
public int reflect.Test.field2
protected int reflect.Test.field3
int reflect.Test.field4
-------指定类或接口中的公共成员字段----------
public int reflect.subTest.field5
-------所有类或接口中的公共成员字段----------
public int reflect.Test.field2
public int reflect.subTest.field5
-------所有类的成员字段----------
private int reflect.Test.field1
public int reflect.Test.field2
protected int reflect.Test.field3
int reflect.Test.field4
-------所有类的方法----------
public void reflect.Test.say()
protected void reflect.Test.sayprotected(int,int)
private void reflect.Test.sayprivate()
-------所有类或接口的公共成员方法----------
public void reflect.Test.say()
public void reflect.subTest.getField0()
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 native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public boolean java.lang.Object.equals(java.lang.Object)
public java.lang.String java.lang.Object.toString()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
-------指定类或接口中的公共成员方法----------
public void reflect.Test.say()
public void reflect.subTest.getField0()
-------指定类方法----------
public void reflect.Test.say()
protected void reflect.Test.sayprotected(int,int)
private void reflect.Test.sayprivate()
-------getDeclaredConstructors构造方法----------
public reflect.Test()
private reflect.Test(java.lang.String)
protected reflect.Test(int,int)
public reflect.Test(int)
-------getConstructors构造方法----------
public reflect.Test()
public reflect.Test(int)
-------getConstructors构造方法----------
public reflect.Test()
===reflect.Test@69b332
a+b=7
a+b=7
===reflect.Test@173a10f
===[Ljava.lang.Class;@530daa
===void
a=4
b=5
hello sayprotected
分享到:
评论

相关推荐

    java面试题--反射机制

    掌握Java反射机制对于开发者来说是非常有价值的,尤其是在开发框架、自动化测试等方面的应用。 #### 十、参考资料 - [Oracle官方文档](https://docs.oracle.com/javase/tutorial/reflect/) - [Effective Java]...

    Java反射机制 Java反射机制

    ### Java反射机制详解 #### 一、Java反射机制概述 Java反射机制是Java语言的一个重要特性,它允许程序在运行时获取类的信息并操作对象。Java反射机制的主要作用包括:获取类的所有属性和方法、构造动态实例、调用...

    候捷谈Java反射机制

    Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时获取和操作任何已知名称的类的内部信息。这一机制使得Java具备了一定的动态性,虽然在传统的分类中Java被视为静态类型语言。通过反射,开发者可以在...

    java 反射机制详解

    Java 反射机制是 Java 语言中的一个重要特性,它允许程序在运行时动态地获取类的信息(如类名、属性、方法等)并调用对象的方法,甚至修改对象的状态。这一机制极大地增强了 Java 程序的灵活性和可扩展性,尤其是在...

    Java反射机制的实现_Reflection

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象等的内部信息。通过Java反射机制,开发者可以在不知道具体类名的情况下创建对象,调用方法,访问和修改私有成员变量,以及...

    JAVA反射机制自定义框架测试代码

    本篇文章将深入探讨Java反射机制,并通过自定义框架的测试代码来进一步理解其应用。 首先,我们需要了解什么是反射。在Java中,反射是指在运行时,程序可以获取类、接口、字段和方法的信息,并且能够调用这些方法,...

    反射实例-JAVA反射机制

    ### 反射实例—JAVA反射机制 #### 一、反射概念及原理 反射在计算机科学领域,特别是程序设计中,是指程序有能力访问、检测和修改其自身的结构和行为。这一概念最早由Smith于1982年提出,并迅速应用于各种编程语言...

    Java反射机制Demo

    ### Java反射机制详解 #### 一、什么是Java反射机制? Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的...

    Java反射机制学习(二)

    这篇博文"Java反射机制学习(二)"可能深入探讨了如何利用反射进行动态类型处理、访问私有成员以及创建对象等核心概念。在这里,我们将详细讨论Java反射的基本用法及其在实际开发中的应用。 1. **什么是反射**: ...

    java 反射机制例子

    ### Java反射机制详解 #### 一、反射的基本概念与历史背景 反射的概念最早由Smith在1982年提出,其核心思想是程序有能力访问、检测甚至修改自身的状态和行为。这种能力一经提出,迅速成为了计算机科学领域的研究...

    Java 反射机制 代码的实例

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象等的内部结构。通过反射,开发者可以动态地获取类的信息并调用其方法,创建对象,访问私有成员,甚至改变类的行为。在深入...

    北大青鸟java反射机制

    Java反射机制是Java编程语言中的一个强大工具,它允许程序在运行时检查并操作类、接口、字段和方法等对象。在"北大青鸟java反射机制"的学习资料中,我们将会深入探讨这一核心特性。 首先,我们要理解反射的核心概念...

    JAVA反射机制的入门代码

    Java反射机制是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这个特性使得Java具有了高度的灵活性和动态性,尤其是在处理元数据、创建对象、调用私有方法...

    Java反射机制

    ### Java反射机制详解 #### 一、什么是Java的反射机制 Java反射机制是Java语言的一种重要特性,使得Java成为了一种动态性很强的语言。通过反射,可以在程序运行时获取类的信息,包括类名、父类、接口、字段、方法...

    java反射机制原理和反射机制总结

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、字段以及方法等对象。这一机制的核心在于`java.lang.Class`类和相关的API,它们提供了对类元数据的访问,使得我们能够在运行时...

    JAVA 反射机制应用

    Java反射机制是Java语言提供的一种强大功能,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类是java.lang.Class,它代表了运行时的类信息。通过Class对象,我们...

    java反射机制,很安逸.不要错过

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查并操作类、接口、字段和方法的信息,打破了通常编译时静态绑定的限制。通过反射,我们可以动态地创建对象,调用方法,访问和修改字段值,甚至...

    Java反射性能测试分析

    Java反射机制是Java编程语言中一个强大的特性,它允许程序在运行时动态地访问、检测和修改类、接口、字段和方法等对象。然而,反射操作通常会引入额外的开销,这在性能敏感的应用场景下可能成为一个瓶颈。本文将深入...

    JAVA反射机制的简单理解

    Java反射机制是Java语言提供的一种强大工具,它允许在程序运行时动态地获取类的信息以及对类的对象进行操作。在Java中,静态编译时类型检查确保了代码的稳定性,但有时我们需要在运行时根据需求动态地创建对象、调用...

Global site tag (gtag.js) - Google Analytics