java反射reflect

一:如何获取Class对象

1 package com.ljq.test;

3 import java.lang.reflect.Field;
4 import java.util.Currency;
6 /**
7* Java反射机制四种获取Class对象的方法
9*@author jiqinlin
11*/
12 publicclass GetClassTest {
13publicstaticvoid main(String[] args) {
14new GetClassTest().checkClass();
15}
17publicboolean checkClass() {
18try {
19System.out.println("1、通过类本身获得对象");
20Class clazz=this.getClass();
21System.out.println(clazz.getName());
22System.out.println("==============");
24System.out.println("2、通过子类的实例获得父类对象");
25Customer customer=new Customer();
26clazz= customer.getClass();
27System.out.println(clazz.getSuperclass().getName());
28System.out.println("==============");
30System.out.println("3、通过类名.class获取对象");
31Class forClass= com.ljq.test.GetClassTest.class;
32System.out.println(forClass.getName());
33System.out.println("==============");
35System.out.println("4、通过类名的字符串获取对象");
36Class forName= Class.forName("com.ljq.test.GetClassTest");
37System.out.println(forName.getName());
38System.out.println("=============");
40}catch (Exception e) {
41returnfalse;}
43returntrue;}}


二:通过Class对象获取所有的方法

Class clazz = Class.forName("java.util.Stack");
Method[] methods = clazz.getDeclaredMethods();
for(Method method : methods){
System.out.println(method.toString());
}

输出控制行:

public synchronized java.lang.Object java.util.Stack.pop()
public java.lang.Object java.util.Stack.push(java.lang.Object)
public boolean java.util.Stack.empty()
public synchronized java.lang.Object java.util.Stack.peek()
public synchronized int java.util.Stack.search(java.lang.Object)


三:获取Field对象以及获取值

public static void main(String[] args) {
try {
Rectangle r = new Rectangle(100,200,100,50);
printHeight(r);
} catch (Exception e) {
e.printStackTrace();
}
}


/**
* 打印Rectangle对象的高度
* @param r
* @throws Exception 
*/
private static void printHeight(Rectangle r) throws Exception {
if(r != null){
Integer height = null;
Class clazz = r.getClass();
//java.awt.Rectangle.Rectangle(int x, int y, int width, int height)
Field heightField = clazz.getField("x");//java.lang.NoSuchFieldException
height = (Integer) heightField.get(r);

System.out.println(height);
}
}


四:Method.invoke()方法

public class ReflectInvoke {


/**
* @param args
*/
public static void main(String[] args) {
try {
Class a = Class.forName("org.zyq.reflection.A");
Object obj = a.newInstance();

Method method = a.getMethod("foo" , int.class);
for(int i = 0 ; i < 10 ; i ++){
method.invoke(obj,i);
}
} catch (Exception e) {
e.printStackTrace();
}
}


}


class A{

public void foo(int i){
System.out.println(i);
}


public void foo(){
System.out.println("Hello zyq!");
}

//通过Calss.getMethods()方法不能获取private权限的方法,通过Class.getDeclaredMethods()方法可以获取private权限的方法。
private void foo(String str){
System.out.println(str);
}

}





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值