目的
客户要求密码校验方式,用自己的认证方式。提供一种方案,在不出补丁的情况下,解决这个问题。
原理
1、本地写一个类,用客户想要的方案,实现密码校验的接口,编译成class类。
2、然后把这个class类,先转换成二进制,再转换成16进制的字符串。
3、将字符串写到客户的数据库里。
4、重启服务,在类加载的时候,把数据库里的字符串再转换成二进制,再转换成class类。
核心逻辑
package remote; import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; /** * @author jiash * @since 2022/3/25 */ public class AAA { public static void main(String[] args) throws Exception { // 将写好的类编译成class String path = "E:\\test\\custom_pass\\CustomRestUrlChecker3.class"; FileInputStream fi = new FileInputStream(path); // class 转换成二进制,再转换成 String int length = readClassLength(path); byte[] data = InputStreamToByte(fi); String ans = bytesToHex(data); System.out.println(ans); // String 转换成class str2Class(ans, length); } public static int readClassLength(String path) throws IOException { // 模拟远程读取class的文件内容 开始 byte[] data = new byte[1024 * 1024 * 2]; FileInputStream fi = new FileInputStream(path); int length = fi.read(data); fi.close(); System.out.println(length); return length; } public static void str2Class(String ans, int length) { byte[] data = hexTobytes(ans); // 加载 Class<?> obj = new RemoteClassLoad().load(data, length); // 使用 try { Object jarTestInstance = obj.newInstance(); TestInterface xx = (TestInterface) jarTestInstance; // TestInterface xx = obj.cast(TestInterface.class).; System.out.println(xx.f()); } catch (Exception e) { e.printStackTrace(); } } public static byte[] InputStreamToByte(InputStream iStrm) throws IOException { ByteArrayOutputStream bytestream = new ByteArrayOutputStream(); int ch; while ((ch = iStrm.read()) != -1) { bytestream.write(ch); } byte[] imgdata = bytestream.toByteArray(); bytestream.close(); return imgdata; } /** * byte[]转Hex */ public static String bytesToHex(byte[] b) { StringBuilder sb = new StringBuilder(); for (byte value : b) { String hex = Integer.toHexString(value & 0xFF); if (hex.length() < 2) { hex = "0" + hex; } sb.append(hex.toUpperCase()); } return sb.toString(); } /** * Hex转byte[],两种情况,Hex长度为奇数最后一个字符会被舍去 */ public static byte[] hexTobytes(String hex) { if (hex.length() < 1) { return null; } else { byte[] result = new byte[hex.length() / 2]; int j = 0; for (int i = 0; i < hex.length(); i += 2) { result[j++] = (byte) Integer.parseInt(hex.substring(i, i + 2), 16); } return result; } } }
原创文章,欢迎转载,转载请注明出处!
标签:Java,String,自定义,hex,length,new,byte,class From: https://www.cnblogs.com/acm-bingzi/p/18408185/str2class