1虫溜、首先一個問題雹姊,什么是類,類是不是對象衡楞?
我們總是說我們new一個對象出來
那么我們還沒有new的時候吱雏,建造的那個java類是不是對象呢?
類是對象瘾境,類是java.lang.Class類的實例對象
對于反射歧杏,我們需要了解Class類(自行百度)
任何一個類都是Class的實例對象,這個實例對象有三種表達方式
第一種表達方式:實際在告訴我們?nèi)魏我粋€類都有一個隱含的靜態(tài)的靜態(tài)成員變量class
Class c1=foo.class;
第二種表達方式:已經(jīng)知道該類的對象通過getClass方式
Class c2=foo1.getClass();
第三種表達方式:
Class c3=null;
可以通過類的類類型創(chuàng)建該類的對象實例
c3=Class.forName("類的地址");
//必須有無參的構造方法
Foo foo=(Foo)c1.newInstance();
c1,c2,c3表示了Foo類的類類型(class type)
需要知道的是類的類類型是一樣的迷守,都指的是一個犬绒,所以c1,c2,c3都是一樣的。都是相等的兑凿。
package reflect;
public class Reflect
{
public static void main(String[] args)
{
Foo foo=new Foo();
//第一種表示方式--->實際在告訴我們?nèi)魏我粋€類都有一個隱含的靜態(tài)成員變量class
Class c1=Foo.class;
//第二中表達方式 已經(jīng)知道該類的對象通過getClass方法
Class c2=foo.getClass();
//第三種
Class c3=null;
try
{
c3=Class.forName("reflect.Foo");
}
catch (ClassNotFoundException e)
{
e.printStackTrace();
}
try
{
System.out.println(c2==c3);
System.out.println(c1==c2);
System.out.println(c1==c3);
//需要有無參數(shù)的構造方法
foo=(Foo) c1.newInstance();
foo.pint();
foo.print("hello world");
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
class Foo
{
public void pint()
{
System.out.println("反射");
}
public void print(String a)
{
System.out.println(a);
}
}
方法反射的操作
要獲取反射對象的方法凯力,首先獲取類的信息,獲取類的類類型
獲取方法 名稱和參數(shù)列表來決定
getMethod獲取為public的方法
getDelcaredMethod獲取自己聲明的方法
package reflect;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class MethodDemo01
{
public static void main(String[] args) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException
{
//要獲取print(int n,int m)的方法礼华,首先獲取類的信息咐鹤,獲取類的類類型
A a=new A();
Class c=a.getClass();
/**
* 獲取方法 名稱和參數(shù)列表來決定
* getMethod獲取為public的方法
* getDelcaredMethod獲取自己聲明的方法
*/
Method m=c.getMethod("print", int.class,int.class);
Method m1=c.getMethod("print", String.class,String.class);
Method m2=c.getMethod("print", new Class[]{});
Method m3=c.getMethod("print",int.class);
//invoke方法的反射操作,如果有值就返回圣絮,如果沒有值就是null類型
Object o=m.invoke(a, 10,20);
o=m1.invoke(a, "hello","world");
o=m2.invoke(a);
Object w=(Integer) m3.invoke(a, 50);
System.out.println(w);
}
}
class A
{
public void print()
{
System.out.println("反射機制");
}
public void print(int n,int m)
{
System.out.println(n+m);
}
public void print(String a,String b)
{
System.out.println(a+" "+b);
}
public Object print(int a)
{
return a;
}
}