クラスを取得して呼び出す方法を反射すると、@Autowired注入メンバーが空であることがわかります.
2280 ワード
シーンの説明:
「クラスパス(たとえば、インタフェースとその実装クラスのような)、メソッド名、メソッドパラメータ(パラメータ不定長、タイプ既知)」を知っている場合、呼び出しメソッドを反射して戻り値を取得します.
メソッドを呼び出すと、クラス内に@Autowiredが注入されたbeanがあるため、このbeanがnullとなり、メソッドでこのメンバーを使用するとエラーが報告されます~
分析:
実は比较的简単な问题で、実例の取得の出所とSpringは関连して、ただ本人の基础がしっかりしていないため考えていないで、ネット上で似たような文章は多くて、しかしすべて言うのがとても乱れて、その上コードもそろっていないで、実は私は1つの言叶について感じます:実例の取得の出所とSpringは関连していけばいいです.
解決方法:
1:クラス内で注入したbeanが空かどうかを判断し,空であればコンテキストを取得する~
この方法はもちろん分かりやすく実行可能ですが、クラス自体のコードを変更するには、こちらは変更したくないので、採用していません.
2:クラスインスタンスを取得する際にコンテキストから取得するか、反射方式classではなく注入する.newInstance(これでSpringに関連付けられてbeanを取得することはできませんが、クラスに@Autowiredという注入で得られたオブジェクトが空になる場合は......)
コードは次のとおりです.
上記のエラーを報告するコードは注釈に示すように、
修正後のコードはコメント以外の所に示すように、
最後の行のコードはファイルを書くので、文章の言うこととは関係なく無視することができます.
「クラスパス(たとえば、インタフェースとその実装クラスのような)、メソッド名、メソッドパラメータ(パラメータ不定長、タイプ既知)」を知っている場合、呼び出しメソッドを反射して戻り値を取得します.
メソッドを呼び出すと、クラス内に@Autowiredが注入されたbeanがあるため、このbeanがnullとなり、メソッドでこのメンバーを使用するとエラーが報告されます~
分析:
実は比较的简単な问题で、実例の取得の出所とSpringは関连して、ただ本人の基础がしっかりしていないため考えていないで、ネット上で似たような文章は多くて、しかしすべて言うのがとても乱れて、その上コードもそろっていないで、実は私は1つの言叶について感じます:実例の取得の出所とSpringは関连していけばいいです.
解決方法:
1:クラス内で注入したbeanが空かどうかを判断し,空であればコンテキストを取得する~
この方法はもちろん分かりやすく実行可能ですが、クラス自体のコードを変更するには、こちらは変更したくないので、採用していません.
2:クラスインスタンスを取得する際にコンテキストから取得するか、反射方式classではなく注入する.newInstance(これでSpringに関連付けられてbeanを取得することはできませんが、クラスに@Autowiredという注入で得られたオブジェクトが空になる場合は......)
コードは次のとおりです.
上記のエラーを報告するコードは注釈に示すように、
修正後のコードはコメント以外の所に示すように、
最後の行のコードはファイルを書くので、文章の言うこととは関係なく無視することができます.
private String billData =
"
" +
"
" +
"\tვლადიმერ ილიჩი ულიანოვი
" +
"\t№26, პირველი ქუჩა, ცენტრალური უბანი
" +
" ";
;
private String template = "/Template/TRUE_theFirstOne/gelujiyaLanguageTest/languageTest1.jasper";
private String classPath = "com.*****.DmsBatchServiceImpl";
// private String classPath = "com.*****.api.DmsBatchService";
private String funcName1 = "makePdfDocument";
private String filePath = "C:\\Users\\tang\\Desktop\\ =========\\ \\languageTestPDF.pdf";
@Test
public void test5() throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InstantiationException,
InvocationTargetException, BaseAppException {
logger.info("************===============************");
Class> cls = Class.forName(classPath); // Class , + Class
Object obj = ApplicationContextHolder.getBeanByType(cls);
Method method = cls.getMethod(funcName1, String.class, String.class);
Object objString = method.invoke(obj, billData, template);
invokeDmsCore.writeFileToDiskByPathAndDoc(objectToBytes(objString), filePath);
}