关于动态代理的一点疑问,求助一下~

LC1990313 2016-06-27 11:26:58
对Proxy.newProxyInstance()这个方法的第一个参数ClassLoader loaer不是太明白,我看了一些参考,有传接口的,有传实现类的,比如:
interface Student(){
public void study();
}

class StudentImpl implements Studen(){
public void study(){

}
}

public static void main(){

void test(){
Student student = (Student) proxy.newProxyInstance(Student.class.getClassLoader,....,.....)
Student student = (Student) proxy.newProxyInstance(StudentImpl.class.getClassLoader,....,.....)
}
}

请问上面这俩获取代理对象有什么区别,一个传接口的类加载器,一个传实现类的类加载器。
还有一个疑问,第二个传实现类的类加载器,在强制类型转换的时候,我一开始将其转换成实现类(StudentImpl),但报错,不能转换,请问这是为什么,我理解的就是,我类加载器传的是实现类的,那么代理对象创建出来的就是StudentImpl类型的一个代理对象,不知道这样理解对不对,还请大神帮忙解答
...全文
103 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
2016-06-27
  • 打赏
  • 举报
回复
import java.util.Vector;

interface Person22{
void print();
}

class Man implements Person22{
int id;
int name;
public void print(){
System.out.print("man");
}
}

public class ClassLoaderTest {
public static void main(String[] args){
try{
ClassLoader loader1 = Person22.class.getClassLoader();
Man m = new Man();
ClassLoader loader2;// = Man.class.getClassLoader();
loader2 = m.getClass().getClassLoader();

ClassLoader loader3 = loader2.getParent();
ClassLoader loader4 = loader3.getParent();
System.out.println(loader1);
System.out.println(loader2);
System.out.println(loader3);
System.out.println(loader4);
System.out.println(loader4.getSystemClassLoader());
System.out.println(loader4.getSystemClassLoader().getParent());

System.out.println(String.class.getClassLoader());
System.out.println(Vector.class.getClassLoader());
}
catch (Exception e){
e.printStackTrace();
}

}
}

好像 JAVA里就只有三种加载器 。
一个加载自己编写的类。
一个加载系统自带的比如Object String Vector 等。还有一个加载一些Jar包的。具体如何也不太清楚。
Intboy 2016-06-27
  • 打赏
  • 举报
回复
jdk的动态代理应该只能传接口吧
2016-06-27
  • 打赏
  • 举报
回复
引用 4 楼 LC1990313 的回复:
[quote=引用 2 楼 fortheother 的回复:]
import java.util.Vector;

interface Person22{
	void print();
}

class Man implements Person22{
	int id;
	int name;
	public void print(){
		System.out.print("man");
	}
}

public class ClassLoaderTest {
	public static void main(String[] args){
		try{
		ClassLoader loader1 = Person22.class.getClassLoader();
		Man m = new Man();
		ClassLoader loader2;// = Man.class.getClassLoader();
		loader2 = m.getClass().getClassLoader();
		
		ClassLoader loader3 = loader2.getParent();
		ClassLoader loader4 = loader3.getParent();
		System.out.println(loader1);
		System.out.println(loader2);
		System.out.println(loader3);
		System.out.println(loader4);
		System.out.println(loader4.getSystemClassLoader());
		System.out.println(loader4.getSystemClassLoader().getParent());
		
		System.out.println(String.class.getClassLoader());
		System.out.println(Vector.class.getClassLoader());
		}
		catch (Exception e){
			e.printStackTrace();
		}
		
	}
}
好像 JAVA里就只有三种加载器 。 一个加载自己编写的类。 一个加载系统自带的比如Object String Vector 等。还有一个加载一些Jar包的。具体如何也不太清楚。
额,那在获取代理对象的时候,传接口的loader和实现类的loader有什么区别呢?[/quote] 根本没区别的,类里就三个 loader。你可以自己将你的类加载器的地址打印出来看看,是不是同一个。
Intboy 2016-06-27
  • 打赏
  • 举报
回复
引用 5 楼 LC1990313 的回复:
[quote=引用 1 楼 fengspg 的回复:] jdk的动态代理应该只能传接口吧
最重要的,传接口和传实现类到底有什么不同呢,实在搞不懂呀,版主大人解答!![/quote] 可以这样理解: Student student = new StudentImpl(); StudentImpl student = new StudentImpl();
Intboy 2016-06-27
  • 打赏
  • 举报
回复
引用 3 楼 LC1990313 的回复:
[quote=引用 1 楼 fengspg 的回复:] jdk的动态代理应该只能传接口吧
实现类也可以的~~~只不过传接口列表那里传 class.getInterfaces就可以了[/quote] 哦,你实现类也是实现了某个接口的呀,这样可以。如果只是个具体类,而不是接口的实现,应该不可以
LC1990313 2016-06-27
  • 打赏
  • 举报
回复
引用 1 楼 fengspg 的回复:
jdk的动态代理应该只能传接口吧
最重要的,传接口和传实现类到底有什么不同呢,实在搞不懂呀,版主大人解答!!
LC1990313 2016-06-27
  • 打赏
  • 举报
回复
引用 2 楼 fortheother 的回复:
import java.util.Vector;

interface Person22{
	void print();
}

class Man implements Person22{
	int id;
	int name;
	public void print(){
		System.out.print("man");
	}
}

public class ClassLoaderTest {
	public static void main(String[] args){
		try{
		ClassLoader loader1 = Person22.class.getClassLoader();
		Man m = new Man();
		ClassLoader loader2;// = Man.class.getClassLoader();
		loader2 = m.getClass().getClassLoader();
		
		ClassLoader loader3 = loader2.getParent();
		ClassLoader loader4 = loader3.getParent();
		System.out.println(loader1);
		System.out.println(loader2);
		System.out.println(loader3);
		System.out.println(loader4);
		System.out.println(loader4.getSystemClassLoader());
		System.out.println(loader4.getSystemClassLoader().getParent());
		
		System.out.println(String.class.getClassLoader());
		System.out.println(Vector.class.getClassLoader());
		}
		catch (Exception e){
			e.printStackTrace();
		}
		
	}
}
好像 JAVA里就只有三种加载器 。 一个加载自己编写的类。 一个加载系统自带的比如Object String Vector 等。还有一个加载一些Jar包的。具体如何也不太清楚。
额,那在获取代理对象的时候,传接口的loader和实现类的loader有什么区别呢?
LC1990313 2016-06-27
  • 打赏
  • 举报
回复
引用 1 楼 fengspg 的回复:
jdk的动态代理应该只能传接口吧
实现类也可以的~~~只不过传接口列表那里传 class.getInterfaces就可以了

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧