1、什么是反射?为什么要反射?反射可以实现的应用场景
如果不用反射,那么代码可能会比较复杂
public static void main(String[] args){
Scanner input=new Scanner(System.in);
System.out.println("请问你需要什么对象?");
String needOnjStr=input.next();
Object o=method1(needObjStr);
}
private static Object method1(String needObjStr){
Object obj=null;
if("A".equal(needOnjStr)){
obj=new A();
}
if("B".equal(needOnjStr)){
obj=new B();
}
if("C".equal(needOnjStr)){
obj=new C();
}
if("Cat".equal(needOnjStr)){
obj=new Cat();
}
//……省略以下代码……
return obj;
}
2、 Class
public static void main(String[] args) {
//我们无法之家通过new方法实例化class类
//Class类无公有化的构造方法,所以报错
//Class<Dog> c=new Class();
//但是我们可以通过以下三种方法进行Class对象的创建
Class dogClass;
//第一种方法:用过类名去调用↓
//通过 类名.class 这个方法会返回要给class对象
dogClass=Dog.class;
//第二种方法:通过对象名去获取↓
Dog dog=new Dog();
dogClass= dog.getClass();
//第三种方法↓,可以通过Class.forName("类的路径");获取class对象
//一般推荐这一种,第一种需要导包,第二种有对象了,就一般不会用对象获取class
//第三种它可以通过读取配置文件来当作String参数,我们可以更加灵活
try{
dogClass=Class.forName("KB18.Day23.Dog");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
try{
Dog dog1=(Dog)dogClass.newInstance();
dog1.method1();
} catch (InstantiationException e) {
//没有无参构方法
System.out.println("没有无参构造器");
e.printStackTrace();
} catch (IllegalAccessException e) {
//说明当没有权限
System.out.println("没有权限");
e.printStackTrace();
}
}
public class Test01{
public static void main(String[] args) throws Exception{
Scanner input=new Scanner(System.in);
while(true){
System.out.println("请问你需要什么对象?");
String needObjStr=intput.next();
Object o=method1(needObjStr);
Object o2=method2(needObjStr);
System.out.println("123"+o.getClass());
System.out.println("456"+o2.getClass());
}
}
private static Object method1(String needObjStr){
Object obj=new Object();
if("A".equal(needOnjStr)){
obj=new A();
}
if("B".equal(needOnjStr)){
obj=new B();
}
if("C".equal(needOnjStr)){
obj=new C();
}
if("Dog".equal(needOnjStr)){
obj=new Dog();
}
//……省略n种以下代码……
return obj;
}
private static Object method2(String needObjStr)throws Exception{
Class c=Class.forName("KB18.KB18Java.scr.Day23.Dog"+needObjStr);
retun c.newInstance();
}
}
3、 Constructor 构造器
public class Test03{
public static void main(String[] args) {
try{
Class<Dog> dogClass=
(Class<Dog>) Class.forName("KB18.KB18Java.scr.Day23.Dog");
Constructor<Dog>[] dogC1=(Constructor<Dog>[]) dog.Class.getDecLaredConstructors();
Constructor<Dog> dogC2=dogClass.getConstructor(String.class);
Constructor<Dog> dogC3=dogClass.getConstructor(Integer.class);
dogC1[2].setAccessible(true);
Dog d1=dogC1[0].newInstance();
Dog d2=dogC2.newInstance("123");
Dog d3=dogC3.newInstance(123);
}catch(ClassNotFoundException e){
//类未找到
e.printStackTrace();
}catch(NoSuchMethodException e){
//没有对应放啊
e.printStackTrace();
}catch(IllegalAccessException e){
//无法实例化指定的类对象时抛出
e.printStackTrace();
}catch(InstantiationException e){
//说明你当前无权限,可以通过以下代码
//c.setAccessible(true);
//上面这行代码可以强行获取权限
e.printStackTrace();
}catch(InvocationTargetExcrption e){
//如果你的构造方法跑出了某个异常,会在这里被捕获
//说明你调用的构造方法抛出了一个异常
e.printStackTrace();
}
}
}
public class Dog{
private Dog(){
}
public Dog(String stre){
System.out.println("调用dogString参数构造器");
}
public Dog(Integer stre){
System.out.println("调用dogInteger参数构造器");
}
public void method1(){
System.out.println("Dog类的Method1方法");
}
}
4、Method
private String sName;
private String iAge;
public Dog(){
}
public Dog(String stre){
System.out.println("调用dogStrig参数构造器");
}
public Dog(Integer stre){
System.out.println("调用dogInteger参数构造器");
}
public void method1(){
System.out.println("Dog类的Mehtod1方法");
}
public String getsName(){
return sName;
}
public void setsName(String sName){
this.sName=sName;
}
public String setiAge(){
return iAge;
}
public void setiAge(String iAge){
this.iAge=iAge;
}
public void testMethod(String str){
System.out.println(str);
}
@Override
public String toString(){
return "Dog{"+
"sName="+sName+"\'"+
",iAge"+iAge+"'}"
}
public static void main(String[] args) {
try{
Class<Dog> dogClass=
(Class<Dog>) Class.forName("src.Day24.Dog");
Dog dog=dogClass.newInstance();
Method[] =dogClass.getClass.getDeClaredMrthods();
System.out.println(dog);
System.out.println("====================================");
for(Method m:ms){
System.out.println(m.getName());
if(m.getName().startwith("set")){
m.invoke(dog,"12");
}
}
System.out.println(dog);
Method testM=dogClass.getClassMethod("tstetMethod",String.class);
testM.invoke(dog,"这是一个测试,我想打印这句话");
}catch(CalssNotFoundException e){
e.printStackTrace();
}catch(IllegalAccessException e){
e.printStackTrace();
}catch(InstantiationException e){
e.printStackTrace();
}catch(InvocationTargetException e){
e.printStackTrace();
}catch(NoSuchMethodException e){
e.printStackTrace();
}
}
5、 Field
public static void main(String[] args) throws Exception{
Class<Dog> dogClass=
(Class<Dog>) Class.forName("src.Day24.Dog");
//获取所有属性
Field[] fields=dogClass.getDevlaredFields();
Dog dog=dogClass.newInstance;
//输出长度
System.out.println("fielsd.length:"+field.length);
for(Field field:fields){
//输出所有属性名字
System.out.println(field.getName());
if("iAge".equals(field,getName())){
//由于iAge是私有属性,所以我们需要加强提权,调用
field.setAccessible(true);
field.set(dog,"3岁");
}
if("sName".equals(field.getName())){
//由于sName时私有属性,所以我么需要强制提权。调用
field.setAccessoible(true);
field.set(dog,"旺财");
}
}
System.out.println(dog);
}
6、 Modifier
public static void main(String[] args) throws Exception{
//我们之前提到的所有的类,方法,属性,狗在其均在getModifiers();
//方法,这个方法会返回对应对象的modifier值,
//我们可以通过这个值去查询它是否包含某个修饰符
//比如,我们想去判断某个属性是否为私有的,如果是,需要提权赋值
Class<Dog> dogClass=
(Class<Dog>) Class.forName("src.Day24.Dog");
//获取所有属性
Field[] fields=dogClass.getDeclaredFields();
Dog dog=dogClass.newInstance();
//输出长度
System.out.println("fileds.length:"+fields.length);
for(Field field:fields){
//输出所有属性名字
System.out.println(field.getName());
if("iAge".equals(field.getName())){
//先通过file.getModifiers()获取属性的所有访问修饰权限值
//再通过Modifier类的静态方法,判断这个属性是否为共有
//如果不是共有,我们需要提权,否则,我们默认无权修改会抛出异常
if(!Modifier.isPublic(field.getModifies())){
field.setAccessible(true);
}
field.set(dog,"3岁");
}
if("sName".equals(field.getName())){
if(!Modifier.isPublic(field.getModifiers())){
field.setAccessible(true);
}
field.setAccessible(true);
field.set(dog,"旺财");
}
}
System.out.println(dog);
}