동적 에이전트 의 5 모드 는 예제 와 Mixin 모드 를 사용 합 니 다.
public interface IPlayable
{
void Play();
}
public class Animal : IPlayable
{
public virtual void Play()
{
Console.WriteLine("Animal.Play");
}
}
public class Dog : Animal
{
public override void Play()
{
Console.WriteLine("Dog.Play");
}
}
public interface IRunable
{
void Run();
}
public class RunAbility : IRunable
{
public void Run()
{
Console.WriteLine("RunAbility.Run");
}
}
public class AnimalInterceptor : IInterceptor
{
public void Intercept(IInvocation invocation)
{
Console.WriteLine("Before AnimalInterceptor.Intercept");
if (invocation.InvocationTarget != null)
{
invocation.Proceed();
}
Console.WriteLine("After AnimalInterceptor.Intercept");
}
}
제1 종:ClassProxy
{
Console.WriteLine("
*************ClassProxy*************
");
var generator = new ProxyGenerator();
var animal = generator.CreateClassProxy<Animal>(new AnimalInterceptor());
animal.Play();
Console.WriteLine(animal.GetType());
Console.WriteLine(animal.GetType().BaseType);
var compositeField = animal.GetType().GetField("__target");
Console.WriteLine(compositeField);
foreach (var interfaceType in animal.GetType().GetInterfaces())
{
Console.WriteLine(interfaceType);
}
}
두 번 째:ClassProxy With Target
{
Console.WriteLine("
*************ClassProxyWithTarget*************
");
var generator = new ProxyGenerator();
var animal = generator.CreateClassProxyWithTarget<Animal>(new Dog(), new AnimalInterceptor());
animal.Play();
Console.WriteLine(animal.GetType());
Console.WriteLine(animal.GetType().BaseType);
var compositeField = animal.GetType().GetField("__target");
Console.WriteLine(compositeField);
foreach (var interfaceType in animal.GetType().GetInterfaces())
{
Console.WriteLine(interfaceType);
}
}
세 번 째:InterfaceProxy WithoutTarget
{
Console.WriteLine("
*************InterfaceProxyWithoutTarget*************
");
var generator = new ProxyGenerator();
var animal = generator.CreateInterfaceProxyWithoutTarget<IPlayable>(new AnimalInterceptor());
animal.Play();
Console.WriteLine(animal.GetType());
Console.WriteLine(animal.GetType().BaseType);
var compositeField = animal.GetType().GetField("__target");
Console.WriteLine(compositeField);
foreach (var interfaceType in animal.GetType().GetInterfaces())
{
Console.WriteLine(interfaceType);
}
}
네 번 째:InterfaceProxy With Target
{
Console.WriteLine("
*************InterfaceProxyWithTarget*************
");
var generator = new ProxyGenerator();
var animal = generator.CreateInterfaceProxyWithTarget<IPlayable>(new Dog(), new AnimalInterceptor());
animal.Play();
Console.WriteLine(animal.GetType());
Console.WriteLine(animal.GetType().BaseType);
var compositeField = animal.GetType().GetField("__target");
Console.WriteLine(compositeField);
foreach (var interfaceType in animal.GetType().GetInterfaces())
{
Console.WriteLine(interfaceType);
}
}
다섯 번 째:InterfaceProxy With TargetInterface
{
Console.WriteLine("
*************InterfaceProxyWithTargetInterface*************
");
var generator = new ProxyGenerator();
var animal = generator.CreateInterfaceProxyWithTargetInterface<IPlayable>(new Dog(), new AnimalInterceptor());
animal.Play();
Console.WriteLine(animal.GetType());
Console.WriteLine(animal.GetType().BaseType);
var compositeField = animal.GetType().GetField("__target");
Console.WriteLine(compositeField);
foreach (var interfaceType in animal.GetType().GetInterfaces())
{
Console.WriteLine(interfaceType);
}
}
Mixin 모드
{
Console.WriteLine("
*************Mixin*************
");
var generator = new ProxyGenerator();
var options = new ProxyGenerationOptions();
options.AddMixinInstance(new RunAbility());
var animal = generator.CreateClassProxy<Animal>(options, new AnimalInterceptor());
animal.Play();
(animal as IRunable).Run();
Console.WriteLine(animal.GetType());
Console.WriteLine(animal.GetType().BaseType);
var compositeField = animal.GetType().GetField("__target");
Console.WriteLine(compositeField);
foreach (var field in animal.GetType().GetFields())
{
if (field.Name.StartsWith("__mixin"))
{
Console.WriteLine(field);
}
}
foreach (var interfaceType in animal.GetType().GetInterfaces())
{
Console.WriteLine(interfaceType);
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Java 동적 에이전트 및 CGLIB 상세 설명2. 동적 에이전트 클래스는 정적 에이전트보다 에이전트 클래스가 원 인터페이스를 실현하지 않고 InvocationHandler를 실현하는 것을 알 수 있습니다.통과 동적으로 프록시 클래스를 생성합니다. 이렇게 하면 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.