>  기사  >  Java  >  Java의 반사 메커니즘에 대해 주의할 사항

Java의 반사 메커니즘에 대해 주의할 사항

黄舟
黄舟원래의
2017-09-21 09:51:231561검색

이 글에서는 클래스의 동적 로딩, 멤버 변수 획득, 생성자 정보 및 기타 필요한 정보를 포함하여 Java 리플렉션 메커니즘과 관련된 내용을 주로 소개합니다.

자바 프로그램을 실행하려면 자바 가상 머신이 자바 클래스를 로드해야 한다는 사실은 누구나 알고 있습니다. Java 클래스는 Java 가상 머신에 의해 로드되지 않으면 정상적으로 실행될 수 없습니다. 이제 우리가 실행하는 모든 프로그램은 컴파일 중에 필요한 클래스가 로드되었음을 알고 있습니다.

Java의 반사 메커니즘은 컴파일 중에 어떤 클래스가 로드되었는지 확인하지 않고 프로그램이 실행될 때만 로드, 감지 및 자체 검사합니다. 컴파일 타임에 알려지지 않은 클래스를 사용하십시오. 이러한 기능은 반사입니다.

반사 메커니즘은 실행 중인 상태에서 모든 클래스에 대해 이 클래스의 모든 속성과 메서드를 알 수 있으며 동적으로 얻은 정보와 동적 함수를 호출할 수 있다는 것입니다. 객체의 메소드를 호출하는 것을 Java 언어의 반사 메커니즘이라고 합니다.

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

클래스 사용법 반영 생성자 반영 멤버 변수 반영

1. 클래스 클래스란 무엇입니까

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


public class User{
} 
public class ClassTest{
User u=new User();
 //方式1:
 Class c1=User.class;
//方式2:
Class c2=u.getClass();
//方式3:
Class c3=Class.forName("com.forezp.User");
 
//可以通过类的类型创建该类的实例对象
User user=(User)c1.newInstance();
}

2. 클래스 클래스의 동적 로딩

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

3. 메소드 정보 얻기

기본 데이터 유형과 void 키워드는 get
ame()을 통해 클래스 이름을 얻을 수 있습니다.


Class c1=String.class;
Class c2=int.class;
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());
  /**
   * 一个成员方法就是一个method对象
   * getMethod()所有的 public方法,包括父类继承的 public
   * getDeclaredMethods()获取该类所有的方法,包括private ,但不包括继承的方法。
   */
  Method[] methods=c.getMethods();//获取方法
  //获取所以的方法,包括private ,c.getDeclaredMethods();
  for(int i=0;i<methods.length;i++){ parametertypes="methods[i].getParameterTypes();" pre="" returntype="methods[i].getReturnType();"></methods.length;i++){>


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

Run:


类的名称:java.lang.String
booleanequals(java.lang.Object,)
java.lang.StringtoString()
inthashCode()
…

넷째, 멤버 변수의 정보를 가져옵니다

당신 클래스 멤버 변수 정보도 얻을 수 있습니다


public static void printFiledInfo(Object o){
  Class c=o.getClass();
  /**
  * getFileds()获取public
  * getDeclaredFields()获取所有
  */
  Field[] fileds=c.getDeclaredFields();
  for(Field f:fileds){
   //获取成员变量的类型
   Class filedType=f.getType();
   System.out.println(filedType.getName()+" "+f.getName());
  }
 }


public static void main(String[] args){
    String s="ss";
    //ClassUtil.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

5. 생성자 정보 가져오기


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 ,)
…

6. 메소드 리플렉션 작업

메소드 가져오기: 메소드를 결정하려면 메소드 이름과 메소드 매개변수를 가져와야 합니다.

메소드의 리플렉션 작업:


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();
  }
 }

Run:


20

이 글에서는 Java 리플렉션의 기본 사용법을 설명했습니다. OK 클래스를 결정하세요 런타임에 임의의 객체가 속하는 객체를 생성합니다. 런타임에 임의의 클래스의 멤버 변수와 메서드를 결정합니다. 런타임에 동적 프록시를 생성합니다.

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

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