以TestURL.java为例,先加密TestURL.class文件,再用自定义类装载器加载并运行。 import java.io.*; public class TestURL{ static public void main( String args[] ) throws Exception { System.out.println("From Main"); System.out.println(args[0]); System.out.println(args[1]); } public void tt( ) throws Exception{ System.out.println("From tt without args"); byte b[]="How are you!".getBytes("UTF8"); FileOutputStream f=new FileOutputStream("ssss.txt"); f.write(b); } public void tt(String s, int i){ System.out.println("Fron tt with args"); System.out.println(s); System.out.println(i); } }
一、生成对称密钥,并保存到文件中
import java.io.*; import javax.crypto.*; public class Skey_DES{ public static void main(String args[]) throws Exception{ KeyGenerator kg=KeyGenerator.getInstance("DESede");//指定加密算法为DESede kg.init(168); //密钥长度 SecretKey k=kg.generateKey( );//产生密钥 FileOutputStream f=new FileOutputStream("key1.dat");//将密钥保存到文件 ObjectOutputStream b=new ObjectOutputStream(f); b.writeObject(k); } }二、加密类文件
import java.io.*; import java.security.*; import javax.crypto.*; public class StreamOut{ public static void main(String args[]) throws Exception{ //获取密钥 FileInputStream f=new FileInputStream("key1.dat"); ObjectInputStream ob=new ObjectInputStream(f); Key k=(Key)ob.readObject( ); //初始化密码器 Cipher cp=Cipher.getInstance("DESede"); if(args[0].equals("dec"))//解密模式 cp.init(Cipher.DECRYPT_MODE, k); else //加密模式 cp.init(Cipher.ENCRYPT_MODE, k); FileInputStream in=new FileInputStream(args[1]);//需要加密(解密)的源文件 FileOutputStream out=new FileOutputStream(args[2]);//加密(解密)后的文件 CipherOutputStream cout=new CipherOutputStream(out, cp); int b=0; while( (b=in.read())!=-1){ cout.write(b); } cout.close(); out.close(); in.close(); } } 加密运行:
C:\java>java StreamOut enc TestURL.class TestURL1.class
C:\java>
在当前目录中删除未加密的TestURL.class,并将加密后的TestURL1.class重命名为TestURL.class
三、自定义类装载器,在当前目录下加载已加密的类文件,并解密import java.io.*; import java.security.*; import javax.crypto.*; public class MyClassLoader2 extends ClassLoader { //覆盖loadClass( )方法 public Class loadClass( String name, boolean resolve ) throws ClassNotFoundException { byte[ ] classData=null; Class c = null; try { c = findLoadedClass(name); if (c != null) return(c); try { c=findClass(name); } catch( Exception fnfe ) { } if (c==null){ c = findSystemClass (name); } if (resolve && c != null) resolveClass( c ); return(c); } catch( Exception e ) { throw new ClassNotFoundException( e.toString()); } } public Class findClass( String name){ byte[ ] classData=null; try{ FileInputStream fkey=new FileInputStream("key1.dat"); ObjectInputStream ob=new ObjectInputStream(fkey); Key k=(Key)ob.readObject( ); Cipher cp=Cipher.getInstance("DESede"); cp.init(Cipher.DECRYPT_MODE, k); //在当前目录下加载名字为name的类文件并解密 FileInputStream in=new FileInputStream(name+".class"); ByteArrayOutputStream out=new ByteArrayOutputStream( ); CipherOutputStream cout=new CipherOutputStream(out, cp); int b=0; while( (b=in.read())!=-1){ cout.write(b); } cout.close(); classData=out.toByteArray( ); } catch(Exception e){ } Class x=defineClass(name, classData, 0, classData.length); return x; } } 四、测试类 import java.lang.reflect.*; public class MyURL4{ static public void main( String args[] ) throws Exception { MyClassLoader3 x=new MyClassLoader3(); Class c = x.loadClass(args[0]); Class getArg1[] = { (new String[1]).getClass() }; Method m = c.getMethod( "main", getArg1 ); String[] my1={"arg1 passed","arg2 passed"}; Object myarg1[] = {my1}; m.invoke( null, myarg1 ); } }<table width="665" border="0"> <tr> <td width="266">运行结果:
C:\java>javac MyClassloader2.javaC:\java>javac MyURL4.java
C:\java>java MyURL4 TestURL
From Main
arg1 passed
arg2 passedC:\java>
</td> <td width="389"> </td> </tr> </table> </td> </tr> <tr>
↑返回目录
前一篇: 把目录中的文件名全部改为小写
后一篇: 获取类的方法列表