Невозможно применить аспекты к классу String - PullRequest
0 голосов
/ 27 мая 2018

Я экспериментировал с AspectJ.Я пытался применить аспект в классе String.Я создал конфигурационный файл Spring как:

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">

    <!-- Enable @AspectJ annotation support -->
    <aop:aspectj-autoproxy />

    <!-- Employee manager -->
    <bean id="employeeManager" class="com.test.advice.EmployeeManager" />

    <!-- Logging Aspect -->
    <bean id="loggingAspect" class="com.test.advice.LoggingAspect" />

    <bean id="bean1" class="java.lang.String">
        <constructor-arg value="abx" />
    </bean>

</beans>

Затем класс Aspect, например,

package com.test.advice;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;

@Aspect
public class LoggingAspect
{

    @Around("execution(* java.lang.String.*(..))")
    public void logAroundGetEmployee(ProceedingJoinPoint joinPoint) throws Throwable
    {
        System.out.println("works");
    }
}

После этого создал класс с основным методом, например:

package com.test.advice;

package com.test.advice;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class AspectJAutoProxyTest
{
    public static void main(String[] args)
    {
        ApplicationContext context = new ClassPathXmlApplicationContext("Spring-Customer.xml");

        String pqr = (String) context.getBean("bean1");

        pqr.trim();

    }
}

При запуске он должен выводить «работает» на консоль.Но он не может сказать,

Exception in thread "main" java.lang.ClassCastException: com.sun.proxy.$Proxy5 cannot be cast to java.lang.String
    at com.test.advice.AspectJAutoProxyTest.main(AspectJAutoProxyTest.java:13)

В чем проблема?Разве мы не можем применить прокси к объектам java.lang?Пожалуйста, помогите.

1 Ответ

0 голосов
/ 27 мая 2018

Чтобы использовать прокси-объект в качестве замены для реального объекта, прокси-объект должен быть подклассом реального объекта.String Будучи final, JVM не позволяет создавать такой подкласс.

(Обратите внимание, что у Spring есть два прокси-режима; один создает фактический подкласс, а другой просто реализует все открытые интерфейсы.возможно, с использованием последнего, но если вы переключитесь на первый, вы увидите исключение во время создания прокси)

...