내부 클래스 로 인 한 cglib 생 성 실패

2747 단어 문제 기록
[b]1.문제 설명[/b]
cglib 라 이브 러 리 를 사용 하여 동적 으로 프 록 시 클래스 를 생 성 할 때 기본 적 인 개조 방법 을 호출 했 습 니 다.enhancer.create()는 일 을 절약 하기 위해 목표 클래스 를 내부 클래스 로 작성 하여 오류 가 발생 했 습 니 다.
java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given
at net.sf.cglib.proxy.Enhancer.emitConstructors(Enhancer.java:721)
at net.sf.cglib.proxy.Enhancer.generateClass(Enhancer.java:499)
at net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25)
at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:216)
at net.sf.cglib.proxy.Enhancer.createHelper(Enhancer.java:377)
at net.sf.cglib.proxy.Enhancer.create(Enhancer.java:285)

원본 코드:
public class CglibTest
{
@Test
public void createTest()
{
Student1 defaultProxy = (Student1)this.createCglibProxy(Student1.class);

defaultProxy.print();
}

private Object createCglibProxy(Class targetClass)
{
// Enhancer create , new 。 。
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(targetClass);
enhancer.setCallback(NoOp.INSTANCE);

return enhancer.create();
}

public class Student1
{
private int age;
private String name;

public int getAge()
{
return this.age;
}

public String getName()
{
return this.name;
}

public void print()
{
System.out.println("age:" + age + ", name:" + name);
}
}
}

[b]2.문제 분석[/b]
오류 표시 생 성 할 때 구조 적 인 파 라 메 터 를 주지 않 았 습 니 다.Student 1 은 기본 적 인 구조 방법 을 사용 하 는 것 처럼 보 입 니 다.파 라 메 터 는 필요 없습니다.과연 Student 1 의 반사 방법 을 보기 위해 구조 방법 은 하나의 매개 변수 가 있 습 니 다.유형 은 CglibTest 입 니 다.구조 방법 을 통 해 외부 류 가 내부 류 로 들 어 왔 습 니 다.이것 도 내부 류 가 외부 류 의 구성원 을 직접 호출 할 수 있 는 이유 입 니 다.
자세 한 참조:
[url]http://www.2cto.com/kf/201402/281879.html[/url]
요점:
1.컴 파 일 러 는 내부 클래스 에 구성원 변 수 를 자동 으로 추가 합 니 다.이 구성원 변 수 는 외부 클래스 의 유형 과 같 습 니 다.이 구성원 변 수 는 외부 클래스 의 대상 을 가리 키 는 참조 입 니 다.
2 컴 파 일 러 는 내부 클래스 의 구조 방법 에 자동 으로 매개 변 수 를 추가 합 니 다.매개 변수의 유형 은 외부 클래스 의 유형 입 니 다.구조 방법 내부 에서 이 매개 변 수 를 1 에 추 가 된 구성원 변수 할당 으로 사용 합 니 다.
3 내부 클래스 의 구조 함 수 를 호출 하여 내부 클래스 대상 을 초기 화 할 때 외부 클래스 의 인용 을 기본 으로 들 어 옵 니 다.
[b]3.문제 해결[/b]
세 가지 방법:
1.Student 1 을 static 내부 클래스 로 정의
2.Student 1 을 밖으로 내 보 내 따로 정의
3.cglib 생 성 시 외부 클래스 대상 전송:
enhancer.create(new Class[]{CglibTest.class}, new Object[]{this});

좋은 웹페이지 즐겨찾기