java 반사 지식 총결

1. 반사를 실현하는 세 가지 방식 1.클래스getClass () 는 우선 Object 슈퍼 클래스 중 개 public final Class> getClass() 가 있습니다.final은 이 방법을 다시 쓸 수 없고 모든 클래스의 실례화 대상을 호출할 수 있음을 의미합니다.단점: 이런 방식의 사용률은 비교적 낮다. 왜냐하면 반드시 먼저 실례화 대상을 해야만 이 방법을 사용할 수 있기 때문이다.2. 가방.클래스class는 조작 클래스의 실례화 대상을 지정하지 않고 클래스 이름을 통해 완성할 수 있습니다. 예를 들어java입니다.util.Date.class hibernate 및 mybatic.단점: 이런 방식은 반드시 명확한 구조, 즉 유형이 반드시 존재해야 하며 특별히 유연하지 않다.3.Class.forName (클래스 이름) 은 클래스 public static Class> forName(String className) throws ClassNotFoundException 에 있습니다.공장 디자인 모델은 jdbc가 드라이브를 불러올 때 유용합니다.이런 방식은 상대적으로 유연하고 엄밀성이 강하지 않아서 조작하는 클래스가 존재하지 않고 문법 오류가 발생하지 않을 수 있지만 운행할 때 반드시 지정한 클래스를 설정해야 한다.
2. 반사 실례화 방식은Class류 대상을 획득한 후에야 실례화 대상의 방법을 조작할 수 있다.public T new Instance() throws Instantiation Exception, Illegal Access Exception 예외 정보 설명: Instantiation Exception: 인스턴스화할 수 없습니다.원인: 무참 구조 방법이나 클래스 이름 오류가 없습니다. IllegalAccessException: 잘못된 접근, 구조 방법이 사유화되었기 때문에 newstance () 는 클래스의 무참 구조 방법만 호출할 수 있습니다. 이것은 new의 실례화 대상에 해당합니다.양자의 차이는 크지 않고 반사 유연성이 더욱 높다.실례화하려면 구조 함수를 호출할 수 있다. 다음 내용은 이 문제를 해결할 것이다.
3. 반사의 핵심 구성원java.lang.reflect 패키지에는 세 가지 핵심 클래스가 있습니다: java.lang.reflect.Constructor,java.lang.reflect.Method,java.lang.reflect.Field 1.구조 함수java.lang.reflect.Constructor 모든 구조 방법 가져오기: public Constructor>[] getConstructors() throws SecurityException 지정한 구조 방법 가져오기: public Constructor getConstructor(Class>... parameterTypes) throws NoSuchMethodException,SecurityException 구조 방법 이름 가져오기: public String getName() 수식자 가져오기: public int getModifiers(), int 형식의 숫자로 되돌아오는 것을 주의하세요. 모든 수식자는 숫자 번호를 통해 얻어집니다. 예를 들어 1이public에 대응하고 toString() 방법으로 복원 작업을 할 수 있습니다.매개 변수 형식 가져오기: public Class>[] getParameterTypes() 구조 방법의 모든 이상 정보를 가져오기: public Class>[] getParameterTypes()다음은 유삼 구조의 실례화 방법으로 유삼의 실례를 사용하는 것을 추천하지 않으며 상대적으로 복잡하므로 반드시 전삼을 제공해야 한다.일반 구조가 간단한 무참한java류 실례화
class Person{
    private String name;
    private Integer age;
    public Person(String name,Integer age){
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }

}

public class Demo {

    public static void main(String args[]) throws Exception {
        Class> demoClass = Class.forName("com.qiuyiliang.Person");
        Constructor> personCst = demoClass.getConstructor(String.class,Integer.class);
        Person person = (Person)personCst.newInstance(" ",100);
        System.out.println(person);
    }
}

2. java.lang.reflect.Method 모든 방법을 얻는다. public Method[] getDeclaredMethods()throws SecurityException//이 방법은 계승하는 방법을 포함하지 않고 본 클래스의 모든 방법만 모든 방법을 얻는다. public Method[] getMethods() throws SecurityException//모든 방법을 얻는다. 계승된 반환값 유형을 포함한다. public Class> getReturnType() 본 클래스를 호출하는 방법: public Object invoke(Object obj,Object... args) throws IllegalAccessException,IllegalArgumentException,InvocationTargetException 주의: 본 클래스의 실례화 대상이 이미 존재한다는 것을 확보해야 한다. 그러나 이런 실례화 대상은 Object로 대체할 수 있다.Class 클래스를 사용하여 인스턴스화된 객체를 반사한 후 Objcect 객체 작업을 통해 아래로 전환할 필요가 없습니다.원칙적으로 간단한 자바 클래스의 속성은 반드시 봉인을 거쳐setter getter 방법을 작성해야 한다.setter 방법을 통해 속성의 값을 설정합니다.method 작업 코드(참조 구성, 반환 값, 매개변수):
class Person{
    private String name;
    private Integer age;
    public Person(String name,Integer age){
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }
    public String running(String str) {
        System.out.println(str);
        return str;
    }

public class Demo {
  public static void main(String args[]) throws Exception {
        Class> demoClass = Class.forName("com.qiuyiliang.Person");
        Constructor> constc = demoClass.getConstructor(String.class,Integer.class);
        Object object = constc.newInstance(" ",100);
        Method method = demoClass.getMethod("running", String.class);
        Object val = method.invoke(object, "running...");
        System.out.println(val);
    }
}

3 . java.lang.reflect.Field (속성 구성원) 구성원 가져오기: public Field [] getFields () throws Security Exception//상속을 포함하는 모든 것을 가져옵니다.그러나 개인 속성 획득 구성원을 가져올 수 없습니다:public Field [] getDeclared Fields() throws Security Exception//이 클래스의 모든 설명 속성을 가져옵니다. 계승된 속성 획득은 포함되지 않습니다. public Field getField (String name) throws NoSuch Field Exception, Security Exception 어떤 속성 획득: public Field get Declared Field (String name) Surowse Ficel Exception, Security Exception Exception Exception
속성 가져오기 유형: public Class
class Person{
    private String name;
    private Integer age;
    public Person(String name,Integer age){
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }


    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    public String running(String str) {
        System.out.println(str);
        return str;
    }

}

public class Demo {

    public static void main(String args[]) throws Exception {
        Class> demoClass = Class.forName("com.qiuyiliang.Person");
        Constructor> constc = demoClass.getConstructor(String.class,Integer.class);
        Field declaredField = demoClass.getDeclaredField("name");
        Object object = constc.newInstance(" ",100);
        Method setMethod = demoClass.getMethod("setName", declaredField.getType());   //   “set”+declaredField.getName()
        Method getMethod = demoClass.getMethod("getName");                            //   “get”+declaredField.getName()
        setMethod.invoke(object, " 2");
        Object getObj = getMethod.invoke(object);
        System.out.println(getObj);
    }
}

4. 반사 응용: (계속...)

좋은 웹페이지 즐겨찾기