Java为什么没有预编译命令
重写,重载,泛型,分别是在运行时还是编译时执行的
1. 方法重载是在编译时执行的,因为,在编译的时候,如果调用了一个重载的方法,那么编译时必须确定他调用的方法是哪个。如:
当调用evaluate("hello")时候,我们在编译时就可以确定他调用的method #1.
2.
方法的重写是在运行时进行的。这个也常被称为运行时多态的体现。编译器是没有办法知道它调用的到底是那个方法,相反的,只有在jvm执行过程中,才知晓到底是父子类中的哪个方法被调用了当有如下一个接口的时候,我们是无法确定到底是调用父类还是子类的方法
3.
泛型(类型检测),这个发生在编译时。编译器会在编译时对泛型类型进行检测,并吧他重写成实际的对象类型(非泛型代码),这样就可以被JVM执行了。这个过程被称为"类型擦除"。
类型擦除的关键在于从泛型类型中清除类型参数的相关信息,并且再必要的时候添加类型检查和类型转换的方法。
类型擦除可以简单的理解为将泛型java代码转换为普通java代码,只不过编译器更直接点,将泛型java代码直接转换成普通java字节码。类型擦除的主要过程如下:
1). 将所有的泛型参数用其最左边界(最顶级的父类型)类型替换。
2). 移除所有的类型参数。
在编译后变成:
4. 注解。注解即有可能是运行时也有可能是编译时。
如java中的@Override注解就是典型的编译时注解,他会在编译时会检查一些简单的如拼写的错误(与父类方法不相同)等
同样的@Test注解是junit框架的注解,他是一个运行时注解,他可以在运行时动态的配置相关信息如timeout等。
5. 异常。异常即有可能是运行时异常,也有可能是编译时异常。
RuntimeException是一个用于指示编译器不需要检查的异常。RuntimeException
是在jvm运行过程中抛出异常的父类。对于运行时异常是不需要再方法中显示的捕获或者处理的。
已检查的异常是被编译器在编译时候已经检查过的异常,这些异常需要在try/catch块中处理的异常。
6. AOP. Aspects能够在编译时,预编译时以及运行时使用。
1).
编译时:当你拥有源码的时候,AOP编译器(AspectJ编译器)能够编译源码并生成编织后的class。这些编织进入的额外功能是在编译时放进去的。
2). 预编译时:织入过程有时候也叫二进制织入,它是用来织入到哪些已经存在的class文件或者jar中的。
3). 运行时:当被织入的对象已经被加载如jvm中后,可以动态的织入到这些类中一些信息。
7. 继承:继承是编译时执行的,它是静态的。这个过程编译后就已经确定
8. 代理(delegate):也称动态代理,是在运行时执行。
② java预编译的问题,其中sql语句执行不了,其他插入什么的都正常,望指点~
pstmt.setString(1,user.getId()+"");
pstmt.setString(2,user.getName());
pstmt.setString(3,user.getPwd());
这是以占位符方式设置 sql的参数值。
你的sql语句String sql = "select id,name,pwd from userinfo where id=10007";
没有用到,所以这几句删了就行了。或者改为:
String sql = "select id,name,pwd from userinfo where id=?";
pstmt.setString(1,user.getId()+"");
③ Java中PreparedStatement和Statement有什么区别 在安全性上
PreparedStatement 可以自己set 值进去 , 而 Statement 只是简单的拼 SQL。所以PreparedStatement相对要安全得多。
like :table Test 里面有两个值 name,age
PreparedStatement p=null;
String sql2 =
"delete from test where age < :x ";
pst2 = conn.prepareStatement(sql2);
pst2.setInt(1, 10); // 这里的10 为之前 :x 处应该传进去的值
而如果是用 Statement
like:
Statement s = conn.createStatement();
String sql = "delete from test where age < " + x; // x=10
s.execute(sql);
想想 这里 要是传进来的x 是 10 and name='xx' 呢?
sql = "delete from test where age < 10 and name='xx' "
是不是 Statement 也照样执行了 所以这样很不安全 因为别人可以随意传数值,和参数。
要是 jion 别的table? 天 你什么信息都可能被拿走
而如果是PreparedStatement.setString() 的话 只会把你传进来的当做参数的 值,
上面那种会变成
sql = "delete from test where age <‘10 and name='xx'’ " 这样是不会有问题滴
④ java中什么是预编译precompile
预编译的作用就是把所以的代码都运行一遍,等你程序运行到模块A,这个时候需要到B模块,就可以直接调用,效果是启动慢,运行快;所以也称JAVA为静态语言,动态语言如JavaScript,特性就是当程序运行到C的时候需要调用D模块,这个时候才会编译D模块。希望对你有帮助,谢谢
⑤ 棰勭紪璇戜负浠涔埚彲浠ラ槻姝sql娉ㄥ叆
棰勭紪璇戝彲浠ラ槻姝sql娉ㄥ叆镄勫师锲狅细杩涜岄勭紪璇戜箣钖庯纴sql璇鍙ュ凡缁忚鏁版嵁搴揿垎鏋愶纴缂栬疟鍜屼紭鍖栦简锛屽苟涓斿厑璁告暟鎹搴扑互鍙傛暟鍖栫殑褰㈠纺杩涜屾煡璇锛屾墍浠ュ嵆浣挎湁鏁忔劅瀛楃︽暟鎹搴扑篃浼氩綋锅氩睘镐у兼潵澶勭悊钥屼笉鏄痵ql鎸囦护浜
澶у堕兘鐭ラ亾锛宩ava涓璊DBC涓锛屾湁涓棰勫勭悊锷熻兘锛岃繖涓锷熻兘涓澶т紭锷垮氨鏄鑳芥彁楂樻墽琛岄熷害灏ゅ叾鏄澶氭℃搷浣沧暟鎹搴撶殑𨱍呭喌锛屽啀涓涓浼桦娍灏辨槸棰勯槻SQL娉ㄥ叆锛屼弗镙肩殑璇达纴搴旇ユ槸棰勯槻缁濆ぇ澶氭暟镄凷QL娉ㄥ叆銆
鐢ㄦ硶灏辨槸濡备笅杈规墍绀猴细
String sql="update cz_zj_directpayment dp"+
"set dp.projectid = ? where dp.payid= ?";
try {
PreparedStatement pset_f = conn.prepareStatement(sql);
pset_f.setString(1,inds[j]);
pset_f.setString(2,id);
pset_f.executeUpdate(sql_update);
}catch(Exception e){
//e.printStackTrace();
logger.error(e.message());
}闾d负浠涔埚畠杩欐牱澶勭悊灏辫兘棰勯槻SQL娉ㄥ叆鎻愰珮瀹夊叏镐у憿锛熷叾瀹炴槸锲犱负SQL璇鍙ュ湪绋嫔簭杩愯屽墠宸茬粡杩涜屼简棰勭紪璇戯纴鍦ㄧ▼搴忚繍琛屾椂绗涓娆℃搷浣沧暟鎹搴扑箣鍓嶏纴SQL璇鍙ュ凡缁忚鏁版嵁搴揿垎鏋愶纴缂栬疟鍜屼紭鍖栵纴瀵瑰簲镄勬墽琛岃″垝涔熶细缂揿瓨涓嬫潵骞跺厑璁告暟鎹搴扑互鍙傛暟鍖栫殑褰㈠纺杩涜屾煡璇锛屽綋杩愯屾椂锷ㄦ佸湴鎶婂弬鏁颁紶缁橮reprareStatement镞讹纴鍗充娇鍙傛暟閲屾湁鏁忔劅瀛楃﹀ or '1=1'涔熸暟鎹搴扑细浣滀负涓涓鍙傛暟涓涓瀛楁电殑灞炴у兼潵澶勭悊钥屼笉浼氢綔涓轰竴涓猄QL鎸囦护锛屽傛わ纴灏辫捣鍒颁简SQL娉ㄥ叆镄勪綔鐢ㄤ简锛
⑥ java中preparedstatement为什么可以防止sql注入
不知道楼主用没有用过
select * from tab_name where name= '"+name+"' and passwd='"+passwd+"';
把其中passwd换成 [' or '1' = '1] 这样就可以完成sql注入
更有可能对你的数据库表drop操作
如果使用preparedstatement的话就可以直接使用预编译,PreparedStatement不允许在插入时改变查询的逻辑结构.
举例
statement
select * from tab_name where name= '"+name+"' and passwd='"+passwd+"';
passwd就可以换成 ‘ or '1'='1
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(sql);
preparedstatement
select * from tab_name where name=? and passwd=? ;
PreparedStatement pst = con.prepareStatement(sql);
pstmt.setString(1, name);
pstmt.setString(2, passwd);
ResultSet rs = pstmt.executeQuery();