>  기사  >  Java  >  Java 반사 메커니즘 지식 요약에 대한 자세한 소개

Java 반사 메커니즘 지식 요약에 대한 자세한 소개

黄舟
黄舟원래의
2017-03-18 11:23:021418검색

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

이 글에서는 다음과 같은 측면에서 성찰 지식을 소개합니다.

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(클래스의 전체 이름) 이 메소드는 클래스의 유형을 나타낼 뿐만 아니라 또한 동적 Load 클래스를 나타냅니다. 컴파일 타임에 로드된 클래스는 정적 로드되고, 런타임에 로드된 클래스는 동적으로 로드됩니다.

3. 메소드 정보 얻기

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

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++){
            //得到方法的返回类型
            Class returnType=methods[i].getReturnType();
            System.out.print(returnType.getName());
            //得到方法名:
            System.out.print(methods[i].getName()+"(");

            Class[] parameterTypes=methods[i].getParameterTypes();
            for(Class class1:parameterTypes){
                System.out.print(class1.getName()+",");
            }
            System.out.println(")");
        }
    }
public class 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){

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

실행:

20

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

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