這篇文章卡了大概一周,一個是沒時間,只能帶娃加鍛煉間隙擠點(diǎn)時間,一個是碰到了問題卡住了。本篇實(shí)現(xiàn)反射調(diào)用ashx實(shí)現(xiàn)類的基礎(chǔ)結(jié)構(gòu)。
首先申明ashx的接口,所有的ashx實(shí)現(xiàn)類繼承實(shí)現(xiàn)該接口的基類
package appcode;
import java.io.*;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
//http執(zhí)行請求接口
public interface IBaseHttpHandler {
/// <summary>
/// 執(zhí)行請求
/// </summary>
/// <param name="request">請求對象</param>
/// <param name="response">響應(yīng)對象</param>
public void ProcessRequest(HttpServletRequest request, HttpServletResponse response);
}
然后實(shí)現(xiàn)第一個不需要會話的基類
package appcode;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.PrintWriter;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.lang.Class;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.jar.JarFile;
import java.util.jar.JarEntry;
import LIS.Core.MultiPlatform.LISContext;
import appcode.IBaseHttpHandler;
//實(shí)現(xiàn)不帶會話的請求基類
public class BaseHttpHandlerNoSession implements IBaseHttpHandler {
///請求對象
public HttpServletRequest Request=null;
///響應(yīng)對象
HttpServletResponse Response=null;
///輸出數(shù)據(jù)到前臺
private void Write(PrintWriter writer,String str)
{
writer.println(str);
writer.flush();
writer.close();
}
/// <summary>
/// 執(zhí)行請求
/// </summary>
/// <param name="request">請求對象</param>
/// <param name="response">響應(yīng)對象</param>
public void ProcessRequest(HttpServletRequest request, HttpServletResponse response)
{
try {
Request = request;
Response = response;
//前臺傳入的要調(diào)用的方法
String method = LISContext.GetRequest(request, "Method");
if (method != "") {
//得到方法
Method m = this.getClass().getMethod(method);
if (m != null) {
//執(zhí)行
Object ret = m.invoke(this);
PrintWriter writer = response.getWriter();
if (ret == null) {
Write(writer, "");
} else {
Write(writer, (String) ret);
}
} else {
//沒有指定名稱的方法
}
} else {
//沒按要求傳調(diào)用方法
}
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
}
然后實(shí)現(xiàn)主中間件中轉(zhuǎn)調(diào)用實(shí)現(xiàn)的ashx
import appcode.IBaseHttpHandler;
import java.io.*;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.concurrent.ConcurrentHashMap;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.*;
@javax.servlet.annotation.WebServlet(name = "MianMiddleware")
public class MianMiddleware extends javax.servlet.http.HttpServlet {
/// <summary>
/// 緩存路徑和類型,允許多線程讀一個線程寫
/// </summary>
private static ConcurrentHashMap<String, Class> hsType = new ConcurrentHashMap<>();
///執(zhí)行post請求
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
String url=request.getRequestURI();
//解析得到類名
String className = url.split("\\.")[0];
PrintWriter writer = response.getWriter();
//反射得到類型
Object objDeal = GetObjectByConfString(className,writer);
//轉(zhuǎn)換處理接口
if(objDeal!=null)
{
//轉(zhuǎn)換成接口
appcode.IBaseHttpHandler baseDeal=(appcode.IBaseHttpHandler)objDeal;
baseDeal.ProcessRequest(request,response);
}
else
{
Write(writer,"為找到名稱為:"+className+"的處理類");
}
}
/// <summary>
/// 通過配置得當(dāng)對象
/// </summary>
/// <param name="confStr">配置/UI/sys/ashx/ashCommonNoSession</param>
/// <returns></returns>
public static Object GetObjectByConfString(String confStr,PrintWriter writer) {
try {
//取第一部分
if (confStr.charAt(0) == '/') {
confStr = confStr.substring(1);
}
if (!hsType.containsKey(confStr)) {
URL urlBase = new File("D:\\Java業(yè)余\\jbase\\Lib\\appcode.jar").toURI().toURL();
//自己生成jar包路徑
URL url = new File("D:\\Java業(yè)余\\jbase\\Lib\\AshDemo.jar").toURI().toURL();
URL[] urls = new URL[]{urlBase,url};
//加載程序集,這里很重要,一定要指定父加載器,否則加載的類和父加載器的類不認(rèn)為是一個類
URLClassLoader loader = new URLClassLoader(urls, MianMiddleware.class.getClassLoader());
ClassLoader loader1=Thread.currentThread().getContextClassLoader();
//加載類
Class c = loader.loadClass("AshDemo.ashDemo");
//先寫死,后面執(zhí)行編譯和從jar包反射
hsType.put(confStr, c);
}
Class c = hsType.get(confStr);
//創(chuàng)建對象
Object o = c.newInstance();
return o;
}
catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
//get直接走post的邏輯
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request,response);
}
///輸出數(shù)據(jù)到前臺
private static void Write(PrintWriter writer,String str)
{
writer.println(str);
writer.flush();
writer.close();
}
}
然后實(shí)現(xiàn)一個ashx的demo
測試
本次碰到的卡殼問題就是通過URLClassLoader加載的類和創(chuàng)建的對象無法轉(zhuǎn)換成接口類型。明明是一個類型,運(yùn)行總是報錯無法轉(zhuǎn)換。各方資料查看加上自己嘗試,發(fā)現(xiàn)要指定URLClassLoader類加載器的父加載器,這樣父加載器加載的類就不會被重復(fù)加載導(dǎo)致類型不匹配了。
下個階段就是實(shí)現(xiàn)文件變化監(jiān)控和比對ashx實(shí)現(xiàn)類代碼和jar包時間自動編譯jar包供反射調(diào)用了。為下圖的每個ashx的Java類生成jar包供反射使用而達(dá)到腳本化的目的,這樣就可以實(shí)現(xiàn)業(yè)務(wù)腳本化和虛擬M層,用虛擬M來兼容打印和儀器接口等。
文章來源:http://www.zghlxwxcb.cn/news/detail-724521.html
卡殼問題沒人詢問是真痛苦,卡過去了收獲不少,有些事看著簡單,動手做多多少少還是有些意外的文章來源地址http://www.zghlxwxcb.cn/news/detail-724521.html
到了這里,關(guān)于Java反射調(diào)用ashx的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!