java反射包_java反射

通过一个对象获得完整的包名和类名

package reflect;

public class GetClass {

public static void main(String[] args) {

GetClass c=new GetClass();

System.out.println(c.getClass().getName());

System.out.println("结果是reflect.GetClass");

Demo d=new Demo();

System.out.println(d.getClass().getName());

System.out.println("结果是reflect.Demo");

}

}

class Demo{

}

所有类的对象其实都是Class的实例。

实例化class对象

package reflect;

public class GetClass {

public static void main(String[] args) {

Class> demo1=null;

Class> demo2=null;

Class> demo3=null;

demo1=Demo.class;

demo2=new Demo().getClass();

try {

demo3=Class.forName("reflect.Demo");

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

System.out.println("demo1,2,3的值是class reflect.Demo");

System.out.println("类名称 "+demo1.getName());

System.out.println("类名称 "+demo2.getName());

System.out.println("类名称 "+demo3.getName());

System.out.println("他们的值都是reflect.Demo");

}

}

class Demo{

}

通过一个类获取其所有的属性

package reflect;

import java.lang.reflect.Field;

import java.lang.reflect.Modifier;

public class hello {

public static void main(String[] args) {

/*获取本类的全部属性*/

Class> demo = null;

/* try {

demo=Class.forName("reflect.Demo");

} catch (ClassNotFoundException e) {

e.printStackTrace();

} */

// demo=Demo.class;

demo=new Demo().getClass();

//获取某个类所声明的字x段(包括public、private、protected)

Field[] field=demo.getDeclaredFields();

for(int i=0;i

//返回修饰符的编码

int mo=field[i].getModifiers();

//获取修饰符名称

String decorate=Modifier.toString(mo);

//输出修饰符名称

System.out.println(decorate);

//获取属性类型

Class> type=field[i].getType();

//输出属性类型

System.out.println(type);

//获取属性名称

System.out.println(field[i].getName());

//如果要获取其自身的属性和其父类或者接口的属性,用

//Field[] field=demo.getFields();这个方法

}

}

}

class Demo{

public String name;

public String age;

private int id;

}

输出结果是

public

class java.lang.String

name

public

class java.lang.String

age

private

int

id

通过class调用其他类中的构造函数

package Reflect;

import java.lang.reflect.Constructor;

class Person{

public Person() {

}

public Person(String name){

this.name=name;

}

public Person(int age){

this.age=age;

}

public Person(String name, int age) {

this.age=age;

this.name=name;

}

public String getName() {

return name;

}

public int getAge() {

return age;

}

@Override

public String toString(){

return "["+this.name+"  "+this.age+"]";

}

private String name;

private int age;

}

class hello{

public static void main(String[] args) {

Class> demo=null;

try{

demo=Class.forName("Reflect.Person");

}catch (Exception e) {

e.printStackTrace();

}

Person per1=null;

Person per2=null;

Person per3=null;

Person per4=null;

//取得全部的构造函数

Constructor> cons[]=demo.getConstructors();

try{

per1=(Person)cons[0].newInstance();

per2=(Person)cons[1].newInstance("Rollen");

per3=(Person)cons[2].newInstance(20);

per4=(Person)cons[3].newInstance("Rollen",20);

}catch(Exception e){

e.printStackTrace();

}

System.out.println(per1);

System.out.println(per2);

System.out.println(per3);

System.out.println(per4);

}

}

【运行结果】:

[null  0]

[Rollen  0]

[null  20]

[Rollen  20]

关于反射中invoke方法的使用

method.invoke(Object obj, Object args[])

obj是个对象,必须是实例化的对象。args是个用于方法调用的参数,是Object数组,因为参数可能有多个。

Method类代表一个方法,所以invoke(调用)就是调用Method类代表的方法。它可以让你实现动态调用,例如你可以动态的传入参数。

package reflect;

import java.lang.reflect.InvocationTargetException;

import java.lang.reflect.Method;

public class Test {

public static void main(String[] args) {

String [] names ={"tom","tim","allen","alice"};

Class> clazz=hi.class;

Method method = null;

try {

method=clazz.getMethod("sayHi", String.class);

} catch (NoSuchMethodException e) {

e.printStackTrace();

} catch (SecurityException e) {

e.printStackTrace();

}

for(String name:names){

try {

method.invoke(clazz.newInstance(), name);

} catch (IllegalAccessException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IllegalArgumentException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (InvocationTargetException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (InstantiationException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}

class hi{

public void sayHi(String name){

System.out.println("hi,"+name);

}

}

结果

hi,tom

hi,tim

hi,allen

hi,alice

getDeclaredMethod

public Method getDeclaredMethod(String name, Class... parameterTypes) throws NoSuchMethodException, SecurityException

java.lang.Class.getDeclaredMethod()方法返回一个Method对象,它反映此Class对象所表示的类或接口的指定已声明方法。name参数是一个字符串,指定所需的方法的简单名称,parameterTypes参数是一个数组的Class对象识别方法的形参类型,在声明的顺序

例如

Method realMethod = serviceProcessor.getClass().getDeclaredMethod(methodName,JSONObject.class);

JSONObject paramJson = (JSONObject) JSONObject.parse(param);

String data = ((String) realMethod.invoke(serviceProcessor, paramJson));

.class和.getClass的区别:

出现的时期不同:Class.forName()在运行时加载;Class.class和getClass()是在编译器加载,即.class是静态加载,.getClass()是动态加载。

.getClass()是一个对象实例的方法,只有对象实例才有这个方法,具体的类是没有的。类的Class类实例是通过.class获得的,显然,类没有.getClass()方法。

如:

protected Logger log=Logger.getLogger(this.getClass());

protected static final Logger log=Logger.getLogger(HttpUtil.class);

注意this是当前类的实例,static表示是静态的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值