참조 구조의 실례화된 대상을 호출하다

Class.forName () 방법으로 Class 대상을 실례화한 후 newInstance () 방법을 직접 호출하면 대상의 실례화 작업을 할 수 있습니다.그러나 주의해야 할 것은 피실례화 대상의 클래스에는 반드시 무참구조 방법이 존재해야 하며 존재하지 않으면 반드시 실례화할 수 없다는 것이다.실제 자바 프로그램 개발에서 반사는 가장 중요한 조작 원리로 현재의 개발 디자인에서 반사 처리 메커니즘, 예를 들어 Struts, Spring 프레임워크 등을 대량으로 응용했다.대부분의 조작에서 기본적으로 무참 구조 방법을 조작하기 때문에 반사 개발 시류에서 무참의 구조 방법을 최대한 보존한다.
 
만약 무참 구조 방법이 없다면 반드시 실례화 대상 조작을 할 수 없습니까?답안은 정해진 것이 아니라 조작할 때 클래스의 구조 방법을 명확하게 호출하면 파라미터를 전달하는 것도 실례화 조작을 할 수 있다.다음 단계를 수행합니다.
1.Class클래스의 getConstructors()를 통해 본 클래스의 모든 구조 방법을 얻기;
2. 구조 방법에 하나의 대상 수조를 전달하여 진행하는데 그 안에 구조 방법에 필요한 각 파라미터를 포함한다.
3. 이후 Constructor를 통해 객체 인스턴스화
 
 
import java.lang.reflect.Constructor;

class Person
{
    private String name;
    private int age;
    
    public Person(String name,int age)
    {
        this.name=name;
        this.age=age;
    }
    
    public String getName()
    {
        return this.name;
    }
    
    public void setName(String name)
    {
        this.name=name;
    }
    
    public int getAge()
    {
        return this.age;
    }
    
    public void setAge(int age)
    {
        this.age=age;
    }
    
    public String toString()
    {
        return " :"+this.name+";"+" :"+this.age;
    }
}

public class ClassInstance {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stubC
        Class<?> class1=null;
        try {
            class1=Class.forName("com.yuchao.reflect.Person");
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
        Person person=null;
        Constructor<?> constructons[]=null;
        constructons=class1.getConstructors();        
        try {
            //person=(Person)class1.newInstance();
            person=(Person)constructons[0].newInstance("yuchao",25);
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }        
        System.out.println(person);
    }

}

 
프로그램 실행 결과:
이름:yuchao;나이
상기 코드는 대상의 실례화 과정을 완성했지만 코드가 비교적 복잡하기 때문에 실제 개발에서 무참한 구조 함수를 최대한 보존해야 한다.
반사적 응용 - 획득류의 구조
java.lang.reflect 패키지에는 다음과 같은 몇 가지 종류가 있습니다:Constructor,Field,Method
다음 클래스와 Class 클래스를 통해 클래스의 반사 작업을 함께 수행할 수 있습니다.
실현된 모든 인터페이스를 얻다
interface China
{
    public static final String NATIONAL_STRING="China";
    public static final String AUTHOR_STRING="yuchao";
    public void sayChina();
    public String sayHello(String name,int age);
}
class Person implements China
{
    private String name;
    private int age;
    
    public Person()
    {
        
    }
    
    public Person(String name,int age)
    {
        this.name=name;
        this.age=age;
    }
    
    public String getName()
    {
        return this.name;
    }
    
    public void setName(String name)
    {
        this.name=name;
    }
    
    public int getAge()
    {
        return this.age;
    }
    
    public void setAge(int age)
    {
        this.age=age;
    }
    
    public String toString()
    {
        return " :"+this.name+";"+" :"+this.age;
    }

    @Override
    public void sayChina() {
        // TODO Auto-generated method stub
        System.out.println(" :"+AUTHOR_STRING+", :"+NATIONAL_STRING);        
    }

    @Override
    public String sayHello(String name, int age) {
        // TODO Auto-generated method stub
        return name+", ! "+age+" !";
    }
}

public class ClassInstance {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stubC
        Class<?> class1=null;
        try {
            class1=Class.forName("com.yuchao.reflect.Person");
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
        Class<?> class2[]=class1.getInterfaces();
        for(int i=0;i<class2.length;i++)
        {
            System.out.println(" :"+class2[i].getName());
        }
    }

}

부류를 얻으려면class1.getInterfaces () 를 class1로 변경합니다.getSuperClass()、class.getConstructors()、class1.getConstructors()[0].getModifiers()

좋은 웹페이지 즐겨찾기