您的位置:首页 > 编程语言 > Java开发

java反射技术常用操作

2013-01-10 14:11 531 查看
package com.saly.bean;

public class Person {

private String name;

private int age;

public Person() {

super();

}

public Person(String name, int age) {

super();

this.name = name;

this.age = age;

}

public static void show(){

System.out.println("person static show run");

}

public void function(String a,int b){

System.out.println("person param function"+"a="+a+"b="+b);

}

private void privateShow(){

System.out.println("private show run");

}

@Override

public String toString() {

return "Person [age=" + age + ", name=" + name + "]";

}

}

package com.saly.test;

import java.lang.reflect.Field;

import java.lang.reflect.InvocationTargetException;

import java.lang.reflect.Method;

/**

* 反射机制是再运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,

* 都能够调用它的任意一个方法和属性,这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

* @author saly

*

*/

public class Reflect {

public static void main(String[] args) throws Exception {

String className = "com.saly.bean.Person";

Class<?> clazz = Class.forName(className);

//accessStaticMethed(args, clazz);

accessParamMethed(clazz);

}

/**

* 访问带参数的方法

* @param clazz

* @throws NoSuchMethodException

* @throws InstantiationException

* @throws IllegalAccessException

* @throws InvocationTargetException

*/

private static void accessParamMethed(Class<?> clazz)

throws NoSuchMethodException, InstantiationException,

IllegalAccessException, InvocationTargetException {

Method method = clazz.getMethod("function",String.class,int.class);

//创建实例对象

Object obj = clazz.newInstance();

method.invoke(obj,"salyfan",25);

}

/**

* 访问静态方法

* 不需要创建对象

* @param args

* @param clazz

* @return

* @throws NoSuchMethodException

* @throws IllegalAccessException

* @throws InvocationTargetException

*/

private static void accessStaticMethed(String[] args, Class<?> clazz)

throws NoSuchMethodException, IllegalAccessException,

InvocationTargetException {

Method method = clazz.getMethod("show", null);

method.invoke(null, null);

}

/**

* 反射技术(访问空参数的函数)

* 需要创建对象

* @param args

* @param clazz

* @throws NoSuchMethodException

* @throws InstantiationException

* @throws IllegalAccessException

* @throws InvocationTargetException

*/

private static void accessMethed(String[] args, Class<?> clazz)

throws NoSuchMethodException, InstantiationException,

IllegalAccessException, InvocationTargetException {

//获取所有公有方法(包括继承父类的)

Method[] meth = clazz.getMethods();

for(Method m:meth){

//System.out.println(m);

}

System.out.println("................................");

//获取所有声明的方法(包括私有,但不包括继承父类的)

Method[] methods = clazz.getDeclaredMethods();

for(Method m:methods){

//System.out.println(m);

}

Method method = clazz.getMethod("toString", null);

//创建实例对象

Object obj = clazz.newInstance();

Object returnValue = method.invoke(obj, args);

System.out.println(returnValue);

}

/**

* 访问字段

* @param clazz

* @throws NoSuchFieldException

* @throws InstantiationException

* @throws IllegalAccessException

*/

private static void accessField(Class<?> clazz)

throws NoSuchFieldException, InstantiationException,

IllegalAccessException {

//获取该类的名称为age的字段()

Field ageField = clazz.getDeclaredField("age");

System.out.println(ageField);

//创建实例对象

Object obj = clazz.newInstance();

//访问私有对象

//对该私有字段进行取消权限检查的能力

ageField.setAccessible(true);//暴力访问

ageField.set(obj, 25);

Object o = ageField.get(obj);

System.out.println(o);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: