java 类装载器 加载内部类的时候报错 java.lang.IllegalAccessError

2016-11-21 18:54:03     0 人阅读    

  最近在使用java的类装载器动态加载class,当发现有内部类的时候,就会报错 没有访问的权限,现在问题解决了,记录一下

 

通通过如下方式反射调用类 ,其中 className就想要动态加载的类

 CustomClassLoader loader = new CustomClassLoader(Thread.currentThread().getContextClassLoader() , className);  
                    Class<?> clazz = loader.loadClass();  
                    task = (Task)clazz.newInstance();  
                    task.run();

每当访问  X509TrustManager x509mgr = new X509TrustManager()  的时候,就报没有权限

直接报错误  java.lang.IllegalAccessError,具体的代码如下。

 

public CloseableHttpClient createHttpsClient() throws NoSuchAlgorithmException, KeyManagementException {
       X509TrustManager x509mgr = new X509TrustManager() {

		public void checkClientTrusted(X509Certificate[] arg0, String arg1)
				throws CertificateException {
		}

		public void checkServerTrusted(X509Certificate[] arg0, String arg1)
				throws CertificateException {
			
		}

		public X509Certificate[] getAcceptedIssuers() {
			return null;
		}
       };
    
       SSLContext sslContext = SSLContext.getInstance("TLS");
       sslContext.init(null, new TrustManager[] { x509mgr }, null);
       SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
    
       return HttpClients.custom().setSSLSocketFactory(sslsf).setDefaultRequestConfig(  
                RequestConfig.custom().setSocketTimeout(5000).setConnectTimeout(5000)
                .setCookieSpec(CookiePolicy.BROWSER_COMPATIBILITY)  
                .build()).build();
   }

刚开始的时候还以为 X509TrustManager  是系统自带的,不能反射呢,不过经过测试发现,由于是在类的内部动态创建的类,在生成class的时候就会生成2个,这个时候通过类加载器的话,就会有问题,内部类不会加载,这样就会报错了,这种情况下如何处理呢?


很简单,把内部类转换成单独的类,在类里面调用就行了,下面是处理方法

修改为 ,创建一个新的类 HttpsX509TrustManager

 

	public CloseableHttpClient createHttpsClient() throws NoSuchAlgorithmException, KeyManagementException {
       X509TrustManager x509mgr = new HttpsX509TrustManager();
    
       SSLContext sslContext = SSLContext.getInstance("TLS");
       sslContext.init(null, new TrustManager[] { x509mgr }, null);
       SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
    
       return HttpClients.custom().setSSLSocketFactory(sslsf).setDefaultRequestConfig(  
                RequestConfig.custom().setSocketTimeout(5000).setConnectTimeout(5000)
                .setCookieSpec(CookiePolicy.BROWSER_COMPATIBILITY)  
                .build()).build();
   }

package com.p2p20.service.util;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.X509TrustManager;

public class HttpsX509TrustManager implements X509TrustManager
{
  
  public void checkClientTrusted(X509Certificate[] arg0, String arg1)
    throws CertificateException
  {}
  
  public void checkServerTrusted(X509Certificate[] arg0, String arg1)
    throws CertificateException
  {}
  
  public X509Certificate[] getAcceptedIssuers()
  {
    return null;
  }
}

 

到这里问题就解决了。。困扰了好几天了


原文地址:http://www.itmmd.com/201611/804.html
该文章由 萌萌的IT人 整理发布,转载须标明出处。

  上一篇
下一篇  根据域名返查ip的方法 ,跳过cnd

精彩回复
发表评论
姓名: