实例讲解Java基础之反射
前期准备
编写一个真实类phone,实现list接口
publicclassPhoneimplementsList{ publicdoubleprice; publicStringname; publicPhone(){ } publicPhone(doubleprice,Stringname){ this.price=price; this.name=name; } publicdoublegetPrice(){ returnprice; } publicvoidgege(Stringh){ System.out.println("gege的"+h); } publicvoidsetPrice(doubleprice){ this.price=price; } publicStringgetName(){ returnname; } publicvoidsetName(Stringname){ this.name=name; } @Override publicStringtoString(){ return"Phone{"+ "price="+price+ ",name='"+name+'\''+ '}'; } @Override publicintsize(){ return0; } @Override publicbooleanisEmpty(){ returnfalse; } @Override publicbooleancontains(Objecto){ returnfalse; } @Override publicIteratoriterator(){ returnnull; } @Override publicObject[]toArray(){ returnnewObject[0]; } @Override publicbooleanadd(Objecto){ returnfalse; } @Override publicbooleanremove(Objecto){ returnfalse; } @Override publicbooleanaddAll(Collectionc){ returnfalse; } @Override publicbooleanaddAll(intindex,Collectionc){ returnfalse; } @Override publicvoidclear(){ } @Override publicObjectget(intindex){ returnnull; } @Override publicObjectset(intindex,Objectelement){ returnnull; } @Override publicvoidadd(intindex,Objectelement){ } @Override publicObjectremove(intindex){ returnnull; } @Override publicintindexOf(Objecto){ return0; } @Override publicintlastIndexOf(Objecto){ return0; } @Override publicListIteratorlistIterator(){ returnnull; } @Override publicListIteratorlistIterator(intindex){ returnnull; } @Override publicListsubList(intfromIndex,inttoIndex){ returnnull; } @Override publicbooleanretainAll(Collectionc){ returnfalse; } @Override publicbooleanremoveAll(Collectionc){ returnfalse; } @Override publicbooleancontainsAll(Collectionc){ returnfalse; } @Override publicObject[]toArray(Object[]a){ returnnewObject[0]; } }
1.反射之4种new对象
publicclassTest2{ publicstaticvoidmain(String[]args)throwsIllegalAccessException,InstantiationException,ClassNotFoundException{ //第一种 Phonep=newPhone(2999,"小米"); System.out.println(p);//Phone{price=2999.0,name='小米'} //第二种需要一个空参构造 ClassphoneClass=Phone.class; Phonephone=phoneClass.newInstance(); phone.setName("华为"); phone.setPrice(3499); System.out.println(phone);//Phone{price=3499.0,name='华为'} //第三种 Class>aclass=Class.forName("com.demo.bean.Phone"); Phonep2=(Phone)aclass.newInstance(); p2.setPrice(2999); p2.setName("魅族"); System.out.println(p2);//Phone{price=2999.0,name='魅族'} //第四种,需要一个配置文件phone.properties Stringname=ResourceBundle.getBundle("phone").getString("myphone"); Class>bClass=Class.forName(name); Phonep3=(Phone)bClass.newInstance(); p3.setPrice(3299); p3.setName("锤子"); System.out.println(p3);//Phone{price=3299.0,name='锤子'} } }
配置文件phone.properties
myphone=com.demo.bean.Phone
2.反射之获取类、父类、实现接口
publicclassTest3{ publicstaticvoidmain(String[]args)throwsClassNotFoundException{ Stringstring=ResourceBundle.getBundle("phone").getString("myphone"); Class>aClass=Class.forName(string); //获取类的完整路径 System.out.println(aClass.getName());//com.demo.bean.Phone //获取类的简单名字 System.out.println(aClass.getSimpleName());//Phone //获取类的父类 Class>superclass=aClass.getSuperclass(); System.out.println(superclass.getName());//java.lang.Object System.out.println(superclass.getSimpleName());//Object //获得类的接口 Class>[]interfaces=aClass.getInterfaces(); for(Class>in:interfaces ){ System.out.println(in.getSimpleName()); } } }
3.反射之获取空参、有参构造
publicclassTest4{ publicstaticvoidmain(String[]args)throwsClassNotFoundException,IllegalAccessException,InstantiationException,NoSuchMethodException{ Stringstring=ResourceBundle.getBundle("phone").getString("myphone"); Class>aClass=Class.forName(string); //调用的是无参的构造方法 Phonep1=(Phone)aClass.newInstance(); p1.setName("华为"); p1.setPrice(2999);//Phone{price=2999.0,name='华为'} System.out.println(p1); //获得无参的构造方法 Constructor>constructor=aClass.getConstructor(); System.out.println(constructor);//publiccom.demo.bean.Phone() //获得所有的构造方法 Constructor>[]constructors=aClass.getConstructors(); for(Constructor>c:constructors ){ System.out.println(c); } } }
4.反射之获取方法
publicclassTest5{ publicstaticvoidmain(String[]args)throwsClassNotFoundException,NoSuchMethodException,InstantiationException,IllegalAccessException,InvocationTargetException{ Stringstring=ResourceBundle.getBundle("phone").getString("myphone"); Class>aClass=Class.forName(string); //包含了父类的方法 Method[]methods=aClass.getMethods(); for(Methodm:methods ){ System.out.println(m); } //本类中的方法,没有父类的方法 Method[]declaredMethods=aClass.getDeclaredMethods(); for(Methodm:declaredMethods ){ System.out.println(m); } Methodgege=aClass.getMethod("gege",String.class); //获取gege方法的权限修饰符 System.out.println(Modifier.toString(gege.getModifiers())); //获取gege方法的返回值类型 System.out.println(gege.getReturnType()); //设置gege的参数值 Objecto=aClass.newInstance(); gege.invoke(o,"aa"); } }
5.反射之获取字段
publicclassTest6{ publicstaticvoidmain(String[]args)throwsClassNotFoundException,NoSuchFieldException,IllegalAccessException,InstantiationException{ Stringstring=ResourceBundle.getBundle("phone").getString("myphone"); Class>aClass=Class.forName(string); //只能调用public字段,但是能得到父类的字段 Field[]fields=aClass.getFields(); for(Fieldf:fields ){ System.out.println(f.getName()); } //只能调用public字段,只能得到本类中的字段 Field[]declaredFields=aClass.getDeclaredFields(); for(Fieldf:declaredFields ){ System.out.println(f.getName()); } //获取某一字段的数据类型 Fieldname=aClass.getField("name"); StringsimpleName=name.getType().getSimpleName(); System.out.println(simpleName); name.setAccessible(true); Objecto=aClass.newInstance(); name.set(o,"华为"); System.out.println(name.get(o)); } }
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对毛票票的支持。如果你想了解更多相关内容请查看下面相关链接