>  기사  >  Java  >  마스터해야 할 Java 반사 메커니즘에 대한 지식 요약

마스터해야 할 Java 반사 메커니즘에 대한 지식 요약

巴扎黑
巴扎黑원래의
2017-04-09 10:35:321726검색
反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。【翻译于 官方文档】


이 기사에서는 다음과 같은 측면에서 Reflection에 대한 지식을 소개합니다.

클래스 사용

메서드 반영

생성자 반영

멤버 변수 반영

1. 클래스란 무엇인가요

객체 지향 세계에서는 모든 것이 객체입니다. 클래스는 객체이고 클래스는 java.lang.Class 클래스의 인스턴스 객체입니다. 또한 클래스 클래스는 Java 가상 머신에서만 새로 생성될 수 있습니다. 모든 클래스는 Class 클래스의 인스턴스 객체입니다. 이 인스턴스 객체에는 세 가지 표현 메서드가 있습니다.

public class User{
}

public class ClassTest{
User u=new User();
//방법 1 :
클래스 c1=User.class;
//방법 2:
클래스 c2=u.getClass();
//방법 3:
클래스 c3=Class.forName(" com.forezp.User");

//클래스 유형을 통해 클래스의 인스턴스 객체를 생성할 수 있습니다
User user=(User)c1.newInstance();
}

2. 클래스의 동적 로딩

Class.forName(클래스의 전체 이름) 이 메소드는 클래스의 유형을 나타낼 뿐만 아니라 클래스의 동적 로딩도 나타냅니다. 수업. 컴파일 타임에 로드된 클래스는 정적으로 로드되고, 런타임에 로드된 클래스는 동적으로 로드됩니다.

3. 메소드 정보 얻기

기본 데이터 유형과 void 키워드는 Class 클래스의 인스턴스입니다. getame()을 통해 클래스 이름을 얻을 수 있습니다. () .

클래스 c1=String.class;
클래스 c2=int.class;
클래스 c3=void.class;
System.out.println(c1.getName());
System.out.println(c2.getSimpleName());
클래스의 모든 메소드를 가져와서 인쇄합니다:

public static void printClassInfo(Object object){
Class c= object .getClass();
System.out.println("클래스 이름: "+c.getName());

/**
* 멤버 메소드는 메소드 객체입니다.
* * getMethod()는 상위 클래스에서 상속된 메소드를 포함하여 모든 공개 메소드를 가져옵니다.
* getDeclaredMethods()는 비공개 메소드를 포함하여 클래스의 모든 메소드를 가져옵니다. 하지만 상속된 메서드는 아닙니다.
*/
메소드[] 메소드= c.getMethods();//메서드 가져오기
//private, c.getDeclaredMethods();

를 포함한 모든 메서드 가져오기 for(int i=0;i                                                                                                           > (");

Class[] parameterTypes=methods[i].getParameterTypes();
for(Class class1:parameterTypes){
                System.out.print(class1.getName()+ ","); }
공용 클래스 ReflectTest {

public static void main(String[] args){
String s="ss";
ClassUtil.printClassInfo(s);
}
}
실행:


类的名称:java.lang.String

booleanequals(java.lang.Object,)

java.lang.StringtoString()

inthashCode()

…

4. 멤버 변수 정보 가져오기

클래스의 멤버 변수 정보도 가져올 수 있습니다.

public static void printFiledInfo(Object o){

클래스 c=o.getClass(); /**

* getFileds()는 공개됩니다.

* getDeclaredFields()는 모두를 가져옵니다.

*/
Field[] fileds=c .getDeclaredFields();

for(Field f:fileds){
+f.getName());
}

}
public static void main(String [] args){
            String s="ss"; printClassInfo(s);
ClassUtil.printFiledInfo(s);
}
실행:


[C value

int hash

long serialVersionUID

[Ljava.io.ObjectStreamField; serialPersistentFields

java.util.Comparator CASE_INSENSITIVE_ORDER

int HASHING_SEED

int hash32

五、获取构造函数的信息

public static void printConstructInfo(Object o){
       Class c=o.getClass();

       Constructor[] constructors=c.getDeclaredConstructors();
       for (Constructor con:constructors){
           System.out.print(con.getName()+”(“);

           Class[] typeParas=con.getParameterTypes();
           for (Class class1:typeParas){
               System.out.print(class1.getName()+” ,”);
           }
           System.out.println(“)”);
       }
   }
public static void main(String[] args){
               String s="ss";
               //ClassUtil.printClassInfo(s);
               //ClassUtil.printFiledInfo(s);
               ClassUtil.printConstructInfo(s);
       }
运行:

java.lang.String([B ,)

java.lang.String([B ,int ,int ,)

java.lang.String([B ,java.nio.charset.Charset ,)

java.lang.String([B ,java.lang.String ,)

java.lang.String([B ,int ,int ,java.nio.charset.Charset ,)

java.lang.String(int ,int ,[C ,)

java.lang.String([C ,boolean ,)

java.lang.String(java.lang.StringBuilder ,)

java.lang.String(java.lang.StringBuffer ,)

...

六、方法反射的操作

获取一个方法:需要获取方法的名称和方法的参数才能决定一个方法。

方法的反射操作:

method.invoke(对象,参数列表);
举个例子:

class A{

   public void add(int a,int b){
       System.out.print(a+b);
   }

   public void toUpper(String a){
       System.out.print(a.toUpperCase());
   }
}
public static void main(String[] args) {
       A a=new A();
       Class c=a.getClass();
       try {
           Method method=c.getMethod("add",new Class[]{int.class,int.class});
           //也可以 Method method=c.getMethod("add",int.class,int.class);
           //方法的反射操作
           method.invoke(a,10,10);
       }catch (Exception e){
           e.printStackTrace();
       }
   }
运行:

20


本篇文章已经讲解了java反射的基本用法, 它可以在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。

위 내용은 마스터해야 할 Java 반사 메커니즘에 대한 지식 요약의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.