Java反射调用ashx

这篇具有很好参考价值的文章主要介绍了Java反射调用ashx。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这篇文章卡了大概一周,一个是没时间,只能带娃加锻炼间隙挤点时间,一个是碰到了问题卡住了。本篇实现反射调用ashx实现类的基础结构。

首先申明ashx的接口,所有的ashx实现类继承实现该接口的基类

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执行请求接口
public interface IBaseHttpHandler {
    /// <summary>
    /// 执行请求
    /// </summary>
    /// <param name="request">请求对象</param>
    /// <param name="response">响应对象</param>
    public void ProcessRequest(HttpServletRequest request, HttpServletResponse response);
}

然后实现第一个不需要会话的基类

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;
//实现不带会话的请求基类
public class BaseHttpHandlerNoSession implements IBaseHttpHandler {
    ///请求对象
    public HttpServletRequest Request=null;

    ///响应对象
    HttpServletResponse Response=null;


    ///输出数据到前台
    private void Write(PrintWriter writer,String str)
    {
        writer.println(str);
        writer.flush();
        writer.close();
    }


    /// <summary>
    /// 执行请求
    /// </summary>
    /// <param name="request">请求对象</param>
    /// <param name="response">响应对象</param>
    public void ProcessRequest(HttpServletRequest request, HttpServletResponse response)
    {
        try {
            Request = request;
            Response = response;
            //前台传入的要调用的方法
            String method = LISContext.GetRequest(request, "Method");
            if (method != "") {
                //得到方法
                Method m = this.getClass().getMethod(method);
                if (m != null) {
                    //执行
                    Object ret = m.invoke(this);
                    PrintWriter writer = response.getWriter();
                    if (ret == null) {
                        Write(writer, "");
                    } else {
                        Write(writer, (String) ret);
                    }
                } else {
                    //没有指定名称的方法
                }
            } else {
                //没按要求传调用方法
            }
        }
        catch (Exception ex)
        {
            ex.printStackTrace();
        }
    }
}

然后实现主中间件中转调用实现的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<>();

    ///执行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);
        //转换处理接口
        if(objDeal!=null)
        {
            //转换成接口
            appcode.IBaseHttpHandler baseDeal=(appcode.IBaseHttpHandler)objDeal;
            baseDeal.ProcessRequest(request,response);
        }
        else
        {
            Write(writer,"为找到名称为:"+className+"的处理类");
        }
    }

    /// <summary>
    /// 通过配置得当对象
    /// </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业余\\jbase\\Lib\\appcode.jar").toURI().toURL();
                //自己生成jar包路径
                URL url = new File("D:\\Java业余\\jbase\\Lib\\AshDemo.jar").toURI().toURL();
                URL[] urls = new URL[]{urlBase,url};
                //加载程序集,这里很重要,一定要指定父加载器,否则加载的类和父加载器的类不认为是一个类
                URLClassLoader loader = new URLClassLoader(urls, MianMiddleware.class.getClassLoader());
                ClassLoader  loader1=Thread.currentThread().getContextClassLoader();
                //加载类
                Class c = loader.loadClass("AshDemo.ashDemo");
                //先写死,后面执行编译和从jar包反射
                hsType.put(confStr, c);
            }
            Class c = hsType.get(confStr);
            //创建对象
            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);
    }

    ///输出数据到前台
    private static void Write(PrintWriter writer,String str)
    {
        writer.println(str);
        writer.flush();
        writer.close();
    }

}

Java反射调用ashx,java,开发语言

然后实现一个ashx的demo
Java反射调用ashx,java,开发语言

测试
Java反射调用ashx,java,开发语言

Java反射调用ashx,java,开发语言

本次碰到的卡壳问题就是通过URLClassLoader加载的类和创建的对象无法转换成接口类型。明明是一个类型,运行总是报错无法转换。各方资料查看加上自己尝试,发现要指定URLClassLoader类加载器的父加载器,这样父加载器加载的类就不会被重复加载导致类型不匹配了。

下个阶段就是实现文件变化监控和比对ashx实现类代码和jar包时间自动编译jar包供反射调用了。为下图的每个ashx的Java类生成jar包供反射使用而达到脚本化的目的,这样就可以实现业务脚本化和虚拟M层,用虚拟M来兼容打印和仪器接口等。

Java反射调用ashx,java,开发语言

卡壳问题没人询问是真痛苦,卡过去了收获不少,有些事看着简单,动手做多多少少还是有些意外的文章来源地址https://www.toymoban.com/news/detail-724521.html

到了这里,关于Java反射调用ashx的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • HarmonyOS鸿蒙基于Java开发: Java UI JS FA调用Java PA机制

    目录 FA调用PA接口 FA调用PA常见问题 示例参考 使用兼容JS的类Web开发范式的方舟开发框架提供了JS FA(Feature Ability)调用Java PA(Particle Ability)的机制,该机制提供了一种通道来传递方法调用、处理数据返回以及订阅事件上报,支持的UI页面和组件请参考构建JS用户界面 。 当前

    2024年01月19日
    浏览(49)
  • Java开发或调用WebService的几种方式

    1.服务端开发与发布 编写接口 编写接口的实现类 发布服务 访问已发布的WebService服务 打开浏览器输入http://127.0.0.1:8888/JaxWSTest?wsdl访问,如下面内容 截图内容1 浏览器中输入wsdl文档中的 http://127.0.0.1:8888/JaxWSTest?xsd=1可查看绑定的参数等信息看如下图: 截图内容2 jdk自带生成W

    2024年01月17日
    浏览(67)
  • Qt安卓开发:调用java代码的获取usb权限

    最近换了工作,新工作是负责用qml做qt安卓开发。 工作中遇到一个问题:安卓设备有USB口,需要插入一个U盘在程序里读写U盘中的文件,由于安卓系统的安全性的问题导致QFile、c++的文件操作相关方法都不能读写成功,想要读写成功只能调用java代码,在java代码里面使用安卓的

    2024年02月06日
    浏览(34)
  • 大数据平台开发——使用Java和Python调用Shell脚本

    大数据平台开发——使用Java和Python调用Shell脚本 在大数据平台开发中,经常会遇到需要调用Shell脚本的场景,倒不是说只能用Shell,毕竟大数据开发到头来一定是个语言无关的事情: 从Hive源码解读大数据开发为什么可以脱离SQL、Java、Scala:https://lizhiyong.blog.csdn.net/article/deta

    2023年04月09日
    浏览(49)
  • HarmonyOS学习路之开发篇—Java UI框架(JS FA调用Java PA)

    使用兼容JS的类Web开发范式的方舟开发框架提供了JS FA(Feature Ability)调用Java PA(Particle Ability)的机制,该机制提供了一种通道来传递方法调用、处理数据返回以及订阅事件上。 当前提供Ability和Internal Ability两种调用方式。 Ability:拥有独立的Ability生命周期,FA使用远端进程

    2024年02月09日
    浏览(43)
  • GaussDB 开发篇+Java调用JDBC访问openGauss数据库

    ★ JDBC获取 ★ 环境信息 ★ Java代码 ※ 如果您觉得文章写的还不错, 别忘了在文末给作者点个赞哦 ~

    2024年02月13日
    浏览(47)
  • 【Java反射】Java利用反射获取和设置对象某属性的值

    通用工具类: 测试:

    2024年02月02日
    浏览(58)
  • Java中的Reflection(反射)、暴力反射

    1.1 反射的出现背景 Java程序中,所有的对象都有两种类型: 编译时类型 和 运行时类型 ,而很多时候对象的编译时类型和运行时类型 不一致 。 例如: 如上 :某些变量或形参的声明类型是 Object 类型,但是程序却需要调用该对象运行时类型的方法,该方法不是Object中的方法

    2024年02月04日
    浏览(46)
  • Java开发 - 带你了解集群间的相互调用,你还在等什么?

    目录 前言 导读 项目准备 集群准备 父工程引入子项目 服务调用方HelloService准备 pom文件 yml文件 Controller文件 服务提供方HelloWorld准备  pom文件 yml文件 Controller文件  运行此两个工程  hello_world组集群 集群调用测试 RestTemplate换成Dubbo行不行,怎么换 两个pom文件引入依赖  两个启

    2024年02月09日
    浏览(42)
  • 【Java 基础篇】Java 反射详解

    Java反射是指在运行时动态地获取类的信息,并可以通过该信息来操作类或对象。通过反射,我们可以在运行时获取类的字段、方法、构造函数等信息,并能够动态地创建对象、调用方法、访问和修改字段的值。本文将详细介绍Java反射的概念、原理和使用方法,并提供一些示

    2024年02月09日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包