這個(gè)應(yīng)該采用預(yù)編譯語句集,它內(nèi)置了處理SQL注入的能力,只要使用它的setString方法傳值即可:
網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、小程序制作、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了烏魯木齊免費(fèi)建站歡迎大家使用!
String?sql=?"select?b?from?表?where?a='?'";
PreparedStatement?preState?=?conn.prepareStatement(sql);
preState.setString(1,?keyword);
ResultSet?rs?=?preState.executeQuery();
Java的功能強(qiáng)大,今兒博洋教育將給大家介紹。 需求:一個(gè)應(yīng)用有兩個(gè)數(shù)據(jù)庫,分別為DB-A,DB-B。 假設(shè)持久層框架使用iBatis來實(shí)現(xiàn),那么SqlMapClient對(duì)象在創(chuàng)建時(shí),對(duì)于兩個(gè)不同的DB連接要有兩個(gè)不同的SqlMapClient對(duì)象, 假設(shè)我們有一個(gè)Service類為MyService.java,該類中有兩個(gè)SqlMapClient對(duì)象sqlMapA、sqlMapB分別對(duì)應(yīng)著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方法 略 // 用于演示查詢后返回一個(gè)String的返回結(jié)果 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類實(shí)現(xiàn): 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數(shù)據(jù)庫取得數(shù)據(jù) public String selectForObjectFromB(String sql, Map in) { return sqlMapB.selectForObject("", null); } // 模擬在DB-A數(shù)據(jù)庫取得數(shù)據(jù) 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"; // 連接的數(shù)據(jù)庫類型 A or B String sqlMap() default ""; // Sql-Map-Config文件的路徑,用于加載iBatis的SqlMapClient對(duì)象 } 定義資源注入的接口 IFieldWiring.java。 之所以這里要定義這個(gè)接口,是為了以后擴(kuò)展用,我們很方便的定義更多的自定義注解。 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(); } } } } 已經(jīng)基本大功告成了,只要將我們的DataSourceWiring.java類使用起來即可。 MyAnnotationBeanProcessor.java,這個(gè)類主要用于為bean對(duì)象注入資源。 import java.lang.reflect.Field; public class MyAnnotationBeanProcessor { /** * 注入資源 * @param serviceObject * @param fieldAutoWirings // 所有實(shí)現(xiàn)IFieldWiring的接口的對(duì)象,我們可以在此擴(kuò)展 * @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; } } } } } 好了,開始我們的測(cè)試類: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)); } } 執(zhí)行結(jié)果: SqlMapClient[sqlMap=com/annotation/sql-map-config-B.xml,type=B] SqlMapClient[sqlMap=com/annotation/sql-map-config-A.xml,type=A] 由執(zhí)行結(jié)果可以說明DataSource資源已經(jīng)被我們正確的注入了。 如果想擴(kuò)展的話,只需要新建一個(gè)類實(shí)現(xiàn)IFieldWiring接口即可。假設(shè)叫InParamWiring.java,實(shí)現(xiàn)了接口定義的兩個(gè)方法后,在使用的時(shí)候,只要用以下代碼便可將資源注入了: MyAnnotationBeanProcessor processor = new MyAnnotationBeanProcessor(); MyService b = new MyService(); processor.wire(b, new DataSourceWiring(), new InParamWiring()); // 注入DataSource、InParam資源. 更多Java學(xué)習(xí)技巧,盡在博洋教育。若您想了解java程序培訓(xùn)價(jià)格,歡迎向我們的在線老師進(jìn)行詳細(xì)了解。
此代碼注入非依賴注入,是hack里的?代碼注入
場(chǎng)景是這樣滴:
機(jī)器上有一個(gè)java進(jìn)程,我不想停止它,但我想把一段代碼植入進(jìn)去,干
一些事情(獲取一些信息,改變一些值,監(jiān)控一些東西,或者其它猥瑣的事情)
這個(gè)進(jìn)程不能停,而且也沒有預(yù)料到現(xiàn)在的事情,或者這個(gè)進(jìn)程的代碼完全不能修改。
好,這篇文章是要干這個(gè)事情,它基于?jvm的?jdi或者jvmti?接口
這里用的jvmti,jdi也可以,麻煩不少
應(yīng)該jdk1.5?就有,需要用c寫。1.6?支持另一種方式,java也可以寫
以前做過類似的事情,代碼找不到了,現(xiàn)在有實(shí)現(xiàn)了一番。
直接上代碼:
被注入的代碼是這樣滴:
while(true) {
System.out.println(System.currentTimeMillis());
Thread.sleep(1000);
}
每隔一秒輸出當(dāng)前時(shí)間,只是示意用。不管什么java程序都行
我要注入的類,那個(gè)方法是固定的:
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
Created-By:?1.6.0_26?(Apple?Inc.)
Agent-Class:?com.zms.inject.MyAgent1
Premain-Class:?com.zms.inject.MyAgent1
操作代碼:
import com.sun.tools.attach.*;
import com.sun.tools.attach.spi.AttachProvider;
VirtualMachine vm=VirtualMachine.attach("24862"); //target java process pid
System.out.println(vm);
vm.loadAgent("/Users/zms/workspace/mt/out/production/agent1.jar","Powered by zms!");
Thread.sleep(1000);
vm.detach();
目標(biāo)程序結(jié)果:?
1317283652520
1317283653520
1317283654521
I'm?injected!?木哈哈哈哈哈
param:?Powered?by?zms!
1317283655521
1317283656522
分享題目:java編譯期間注入代碼 java編譯時(shí)注解 生成代碼
本文URL:http://vcdvsql.cn/article0/hejgoo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計(jì)、微信小程序、動(dòng)態(tài)網(wǎng)站、App開發(fā)、網(wǎng)站內(nèi)鏈、營銷型網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)