网站首页 > 文章中心 > 其它

java编译期间注入代码

作者:小编 更新时间:2023-10-09 10:26:35 浏览量:52人看过

java脚本注入

这个应该采用预编译语句集,它内置了处理SQL注入的能力,只要使用它的setString方法传值即可:

String?sql=?"select?b?from?表?where?a='?'";

PreparedStatement?preState?=?conn.prepareStatement(sql);

preState.setString(1,?keyword);

ResultSet?rs?=?preState.executeQuery();

如何利用Java实现资源注入

Java的功能强大,今儿博洋教育将给大家介绍. 需求:一个应用有两个数据库,分别为DB-A,DB-B. 假设持久层框架使用iBatis来实现,那么SqlMapClient对象在创建时,对于两个不同的DB连接要有两个不同的SqlMapClient对象, 假设我们有一个Service类为MyService.java,该类中有两个SqlMapClient对象sqlMapA、sqlMapB分别对应着DB-A、DB-B. 先看看我们的SqlMapClient.java类:(自定义SqlMapClient类,用来演示.) import java.util.Map; import org.apache.commons.lang.builder.ToStringBuilder; import org.apache.commons.lang.builder.ToStringStyle; @SuppressWarnings("unchecked") public class SqlMapClient { public SqlMapClient(String s, String t) { sqlMap = s; type = t; } public SqlMapClient() { } private String type = null; private String sqlMap = null; // get、set方法 略 // 用于演示查询后返回一个String的返回结果 public String selectForObject(String sql, Map in) { return this.toString(); } @Override public String toString() { return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE).append("sqlMap", sqlMap) .append("type", type).toString(); } } MyService.java类实现: import java.util.Map; @SuppressWarnings("unchecked") public class MyService { @DataSource(type="B", sqlMap="com/annotation/sql-map-config-B.xml") private SqlMapClient sqlMapB = null; @DataSource(type="A", sqlMap="com/annotation/sql-map-config-A.xml") private SqlMapClient sqlMapA = null; // get、set方法 略 // 模拟在DB-B数据库取得数据 public String selectForObjectFromB(String sql, Map in) { return sqlMapB.selectForObject("", null); } // 模拟在DB-A数据库取得数据 public String selectForObjectFromA(String sql, Map in) { return sqlMapA.selectForObject("", null); } } 此时此刻呢就是我们的注解类:DataSource.java import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface DataSource { /** * Dao的类型 * @return */ String type() default "A"; // 连接的数据库类型 A or B String sqlMap() default ""; // Sql-Map-Config文件的路径,用于加载iBatis的SqlMapClient对象 } 定义资源注入的接口 IFieldWiring.java. 之所以这里要定义这个接口,是为了以后扩展用,我们很方便的定义更多的自定义注解. IFieldWiring.java import java.lang.annotation.Annotation; import java.lang.reflect.Field; public interface IFieldWiring { Class clazz = obj.getClass(); try { String methodname = "get" ◆ StringUtils.capitalize(fieldName); Method method = clazz.getDeclaredMethod(methodname); method.setAccessible(true); return method.invoke(obj); } catch (Exception e) { try { Field field = clazz.getDeclaredField(fieldName); field.setAccessible(true); return field.get(obj); } catch (Exception e1) { e1.printStackTrace(); } } return null; } public static void setFieldValue(Object target, String fname, Class fieldClass, Object fieldObj) { if (!fieldClass.isAssignableFrom(fieldObj.getClass())) { return; } Class clazz = target.getClass(); try { Method method = clazz.getDeclaredMethod("set" ◆ Character.toUpperCase(fname.charAt(0)) ◆ fname.substring(1), fieldClass); method.setAccessible(true); method.invoke(target, fieldObj); } catch (Exception e) { try { Field field = clazz.getDeclaredField(fname); field.setAccessible(true); field.set(target, fieldObj); } catch (Exception e1) { e1.printStackTrace(); } } } } 已经基本大功告成了,只要将我们的DataSourceWiring.java类使用起来即可. MyAnnotationBeanProcessor.java,这个类主要用于为bean对象注入资源. import java.lang.reflect.Field; public class MyAnnotationBeanProcessor { /** * 注入资源 * @param serviceObject * @param fieldAutoWirings // 所有实现IFieldWiring的接口的对象,我们可以在此扩展 * @throws Exception */ public void wire(Object serviceObject, IFieldWiring fieldAutoWirings) throws Exception { Class cls = serviceObject.getClass(); for (Field field : cls.getDeclaredFields()) { for (IFieldWiring fieldAutoWiring : fieldAutoWirings) { if (field.isAnnotationPresent(fieldAutoWiring.annotationClass())) { fieldAutoWiring.wiring(serviceObject, field); break; } } } } } 好了,开始我们的测试类:FieldWiringTest.java public class FieldWiringTest { public static void main(String args[]) throws Exception { MyAnnotationBeanProcessor processor = new MyAnnotationBeanProcessor(); MyService b = new MyService(); processor.wire(b, new DataSourceWiring()); // 注入DataSource资源 System.out.println(b.selectForObjectFromB("", null)); System.out.println(b.selectForObjectFromA("", null)); } } 执行结果: SqlMapClient[sqlMap=com/annotation/sql-map-config-B.xml,type=B] SqlMapClient[sqlMap=com/annotation/sql-map-config-A.xml,type=A] 由执行结果可以说明DataSource资源已经被我们正确的注入了. 如果想扩展的话,只需要新建一个类实现IFieldWiring接口即可.假设叫InParamWiring.java,实现了接口定义的两个方法后,在使用的时候,只要用以下代码便可将资源注入了: MyAnnotationBeanProcessor processor = new MyAnnotationBeanProcessor(); MyService b = new MyService(); processor.wire(b, new DataSourceWiring(), new InParamWiring()); // 注入DataSource、InParam资源. 更多Java学习技巧,尽在博洋教育.若您想了解java程序培训价格,欢迎向我们的在线老师进行详细了解.

求JAVA 注入进程的例子

此代码注入非依赖注入,是hack里的?代码注入

场景是这样滴:

机器上有一个java进程,我不想停止它,但我想把一段代码植入进去,干

一些事情(获取一些信息,改变一些值,监控一些东西,或者其它猥琐的事情)

这个进程不能停,而且也没有预料到现在的事情,或者这个进程的代码完全不能修改.

好,这篇文章是要干这个事情,它基于?jvm的?jdi或者jvmti?接口

这里用的jvmti,jdi也可以,麻烦不少

以前做过类似的事情,代码找不到了,现在有实现了一番.

直接上代码:

被注入的代码是这样滴:

while(true) {

System.out.println(System.currentTimeMillis());

Thread.sleep(1000);

}

每隔一秒输出当前时间,只是示意用.不管什么java程序都行

我要注入的类,那个方法是固定的:

package com.zms.inject;

import java.lang.instrument.Instrumentation;

public class MyAgent1 {

public static void premain(String s) {

premain(s, null);

public static void premain(String s, Instrumentation instru) {

System.out.println("I'm injected! 木哈哈哈哈哈");

System.out.printf("param: %s\n", s);

public static void agentmain(String args, Instrumentation inst) {

premain(args, inst);

public static void agentmain(String args) {

premain(args);

编译,打入jar包

MANIFEST.MF

Manifest-Version:?1.0

Agent-Class:?com.zms.inject.MyAgent1

Premain-Class:?com.zms.inject.MyAgent1

操作代码:

import com.sun.tools.attach.*;

import com.sun.tools.attach.spi.AttachProvider;

System.out.println(vm);

vm.loadAgent("/Users/zms/workspace/mt/out/production/agent1.jar","Powered by zms!");

vm.detach();

目标程序结果:?

I'm?injected!?木哈哈哈哈哈

param:?Powered?by?zms!

以上就是土嘎嘎小编为大家整理的java编译期间注入代码相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!

版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载、或以其他方式使用本站《原创》内容,违者将追究其法律责任。本站文章内容,部分图片来源于网络,如有侵权,请联系我们修改或者删除处理。

编辑推荐

热门文章