問題タブ [javassist]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
jboss - JBoss 6.x の jsf-console 3.x は可能ですか?
アプリケーションを JBoss 4.2.2 AS から 6.x AS に移動しようとしています。現在、AS で jbpm 3.x を実行しようとしています.par ファイルをサーバーにアップロードしようとすると、次の問題が発生します。
13:41:51,713 ERROR [org.jbpm.db.GraphSession] (http-127.0.0.1-8888-1) java.lang.ClassCastException: org.jbpm.graph.def.Node_$$_javassist_92 を javassist にキャストできません。 util.proxy.ProxyObject
13:41:51,740 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/app].[ProcessUploadServlet]] (http-127.0.0.1-8888- 1) サーブレット ProcessUploadServlet の Servlet.service() が例外をスローしました: org.jbpm.JbpmException: プロセス定義 'ProcessName' が見つかりませんでした。
javassist の古いバージョンと新しいバージョンの両方を使用してみましたが、プラスの効果はありません。何か案は?
java - パラメータシーケンスを知らずにConstructor.newInstance()?
たとえば、次のコードを使用します。
を使用User.class.getConstructors()
して 2 つのコンストラクターがあることを確認できます。 を使用するとconstructor.getParameterTypes()
、2 つの String パラメーターを持つ 1 つのコンストラクターがあることを識別できます。リフレクションを使用して、ユーザー名とパスワードの 2 つのプロパティを見つけることもできます。しかし、実行時には、constructor.newInstance(?,?) を呼び出すために使用される 2 つのパラメーターの適切な順序はわかりません。
constructor.newInstance(username , password)
、およびconstructor.newInstance(password , username)
両方とも有効ですが、結果はまったく異なります。
User.class.newInstance()
引数なしのコンストラクターが保護されているため、プロパティ値を使用および設定できません。
一般的な JPA CRUD ツールを作成しようとしているため、この問題が発生します。一覧・閲覧・更新・削除OK。しかし今、オンラインでオブジェクトを作成できないという問題に直面しています。エンティティ クラスはすべて、保護された引数なしのコンストラクター (したがって、class.newInstance() を使用できません) と、1 つのパラメーターの多いパブリック コンストラクター (ただし、パラメーター名は実行時に消去されます) を備えています。
これを行う方法 ?javassist やその他のプロキシ技術は役に立ちますか? どうやって ?どうもありがとう !
plugins - PlayPlugin.enhance 中に見つからないクラスの問題
Play プラグインで基本的なバイトコード拡張を試していますが、ApplicationClasses.ApplicationClass
指定された で操作しようとすると、クラスが見つかりません。
例外は
Play フレームワークがenhance
メソッドを呼び出しています。まだ利用できないクラスを処理するよりもよく知っているべきではありませんか? これを機能させるにはどうすればよいですか?
java - エラーの確認:opc_invokeinterfaceのargs_sizeに一貫性がありません
(Javassistを使用して)いくつかの動的コードを生成しようとしましたが、double配列またはfloat配列を含む場合、プログラムは特定の時点で失敗します。コードは次のとおりです
生成されるコードは次のとおりです
ただし、getDeclaredConstructorsがc.getDeclaredConstructors()と呼ばれると、問題が発生します...次のエラーがスローされます
スレッド"main"の例外java.lang.VerifyError:(class:testapp1 / Dyn、method:processDoublesignature:(Lsomething / Output; Ljava / lang / Object;)V)opc_invokeinterfaceのargs_sizeに一貫性がありません
回避策は存在しますが、意味がありません。つまり、double配列のコピーを作成し、それを動的コードのprocessDoubleに渡すだけで、つまり動的コードが
要するに、例外UnhandledはgetDeclaredConstructorによってスローされますが、コンストラクターを作成するかどうかは関係ないため、実際にはコンストラクターとは関係ありません。
うまくいけば、私の問題とコードは十分に明確です、混乱があれば教えてください、事前にありがとう:)
java - スーパークラスメソッドで動作しないHibernateプロキシオブジェクト
Hibernateを使用するWebアプリケーションがあります。コードベースをHibernate3.6(3.3.2から)にアップグレードした後、Hibernateによって生成されたプロキシデータオブジェクトが一部のメソッドに対してのみ正しい値を返すことがわかりました。具体的なデータモデルクラスのメソッドは正常に機能しているようですが、@MappedSuperclass
抽象スーパークラスのメソッドは機能していません。
これが私たちが持っているデータモデルです:
これはHibernate3.3.2では問題なく機能しましたが、Hibernate 3.6にアップグレードした後、アプリケーションは失敗しました。次のテストコードは、問題を示しています。
そのコードの出力は次のとおりです。
これらのメソッドのうち4つが誤った結果を返しました:getId()、getVersion()、getLastUpdateDate()、およびgetCreatedDate()が0またはnullを返しました。データベースの実際の行には、ゼロ以外/ヌル以外の値があります。ただし、getName()、getPath()、および最も不思議なことにgetSecurityId()は正常に機能しました。
なぜこれが起こっているのか誰かが説明できますか?マップされたスーパークラスの根本的な問題ですか、それともこれが発生する可能性がある別の理由がありますか?
Form
Hibernateによって返されるオブジェクトはJavassistプロキシであることに注意してください。デバッガーで表示すると、通常、Form_$$_javassist_15
などのようなクラス名が付けられます。
アップデート:
この問題は、JavassistではなくHibernateで発生しているようです。hibernate.propertiesで設定してバイトコード生成をCGLIBに切り替えましたが、CGLIBを配置しhibernate.bytecode.provider=cglib
てもまったく同じ誤った結果が得られます(Hibernateによって返されるクラス名がになるためCGLIBが機能していることを確認しましたForm$$EnhancerByCGLIB$$4f3b4523
)。
しかし、なぜそれがうまくいかないのかを特定することにはまだ近づいていません。
java - バイトコードを変更して javassist で保存することはできますか?
私がウェブ上で見つけたすべての参考文献は、実行時にバイトコードを変更できると言っていますが、その変更されたバイトコードが元のバイトコードを置き換えることができるかどうかはわかりません.
このようにして、元のバイトコードを 1 回置き換えることができ、残りの時間は後で強化されたものを使用できます。
java - Hibernate カスタム プロキシ ジェネレータ - equals() による遅延プロキシの初期化を停止する
エンティティ クラスがあり、これらのエンティティ クラスは、クラスの ID を比較する独自の equals() 関数を実装しています。悲しいことに、Hibernate プロキシで equals() を呼び出すと初期化されますが、これは私の場合はまったく役に立ちません。
javassist をプロキシ プロバイダーとして使用します。equals 呼び出し中にエンティティをロードしないようにプロキシ生成コードを変更する方法はありますか? Hibernate でカスタム プロキシ プロバイダをプラグインできますか?
Hibernate で equals がどのように動作するかについての議論を開始しないでください。
java - Javaでインターフェースメソッドを呼び出すカウントパラメータを計算する方法は?
私はjavassistを使用しており、ロードタイム/ランタイムでインターフェースやその他のものを生成しています。
インターフェースのメソッドを (バイトコードの invokeinterface で) 呼び出すには、いくつかのパラメーターを提供する必要があります: indexbyte1、indexbyte2、count、および 0 ( http://java.sun.com/docs/books/jvms/second_edition/html/Instructions2 から)。 doc6.html )。
呼び出したい抽象メソッド (CtMethod) が既にあるのですが、そのカウントを計算するにはどうすればよいですか?
たとえば、http://java.sun.com/docs/books/jvms/second_edition/html/Instructions2.doc6.htmlでは、「invokeinterface 命令のカウント オペランドは、引数値の数の測定値を記録します。 long 型または double 型の引数値はカウント値に 2 単位寄与し、その他の型の引数は 1 単位寄与します。この情報は、選択したメソッドの記述子から取得することもできます。冗長性は歴史的なものです。 "
しかし、「カウントオペランドはゼロであってはならない符号なしバイトです」とも言います。
呼び出したい抽象メソッドにパラメーターがない場合、カウントは 0 になります!? ただし、count を 0 にすることはできません。メソッドの記述子は ()V です。
助言がありますか?
java - Javassist-クラスにアノテーションを追加してもリフレクションでは機能しません
javassistを使用してクラスを作成し、それにアノテーションを追加しています。CtClass.writeFileを使用し、Javaデコンパイラでクラスファイルを表示すると、アノテーションはありますが、class.getAnnotations()またはclass.getDeclaredAnnotations()を使用すると、リストは空になります。
java - バイトコードからメソッドに関する情報を取得するには?
メソッド内で作成されるオブジェクトと、バイトコードに関連する変数の名前を知りたいですか? 私はそれを発見できますか?javassist を使用して不成功を試みました。何か案が?