我正在尝试使用 Scala 3 宏和 TASTY 重写方法。我想重写任何类型的任何方法。现在我从这个简单的案例开始。
我有一个测试基类:
class TestClass {
def func(s: String) = "base"
}
Run Code Online (Sandbox Code Playgroud)
我想实现这一点,但是通过使用 TASTY,我发现不可能调用new A
带有引号和拼接的泛型类型:
'{
new TestClass() {
override def func(s: String) = "override"
}
}.asExprOf[A]
Run Code Online (Sandbox Code Playgroud)
我打印了上述代码的 AST,并且几乎成功地重新创建了它。问题是我无法调用new
生成的类 - 我没有找到访问新类的符号或类型的方法。我也尝试Symbol.requiredClass()
使用新名称,尽管它返回了一些符号,但在宏扩展期间出现错误,未找到该类。
我的问题是:
new Class {}
情况下派生自定义类型?ClassDef.copy
注册一个可以帮助创建新实例的新名称?ClassDef
创建类的实例吗?Symbol.requiredClass
即使之前没有定义,如何使用返回的符号,因为它会返回某些内容?我创建的代码:
import scala.quoted.*
object NewClass {
def newClassImpl[A: Type](e: Expr[A])(using Quotes): Expr[A] = {
import quotes.reflect.*
val typeRep = TypeRepr.of[A]
val ret = typeRep.classSymbol.map(_.tree) match …
Run Code Online (Sandbox Code Playgroud) 您好我在Tomcat 7服务器上创建了一个JNDI资源,我正在尝试通过persistence.xml使用它,但是我收到一个错误,即在上下文中找不到资源名称.我尝试在网上找到其他解决方案,但没有为我工作.有谁看到了什么问题?在我的server.xml片段下面:
<GlobalNamingResources>
<!-- Editable user database that can also be used by
UserDatabaseRealm to authenticate users
-->
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml"/>
<Resource name="jdbc/myds" auth="Container"
type="javax.sql.DataSource"
maxActive="10" maxIdle="3" maxWait="10000"
username="boardgames" password="boardgames"
driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
url="jdbc:sqlserver://localhost:1433;databaseName=boardgames;integratedSecurity=true;"
/>
</GlobalNamingResources>
Run Code Online (Sandbox Code Playgroud)
我还在web.xml中添加了资源引用:
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/mydb</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
Run Code Online (Sandbox Code Playgroud)
persistence.xml中:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
<persistence-unit name="persistence_sample" transaction-type="RESOURCE_LOCAL">
<!--
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
-->
<non-jta-data-source>java:/comp/env/jdbc/myds</non-jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.SQLServer2008Dialect"/> <!-- Enable Hibernate's automatic …
Run Code Online (Sandbox Code Playgroud)