反射

反射

反射:
	jdk1.5引入
	优点:	
		提高java代码的灵活性,使java语言从静态语言 变为半动态语言.
没有学反射时创建对象:
 	先创建类,在类中定义属性方法,使用new创建对象,
反射使用场景:
		1,使用第三方库,可以创建对象,但不知道对象拥有的属性与方法,想要获取,就需要通过反射获取.
		2,使用第三方法类库,只知道类名,不知道类名,不知道类中有什么,可以通过反射获取使用
		3,使用第三方类库,只知道报名与类名,但是操作,可以用到反射进行操作

类对象

1.一个类被jvm加载时,会生成类对象
	注意:
		1.一个类只会被jvm加载一次,所以一个类的类对象只有一个.
		2.通过new关键字创建出来的对象,称为类的对象,又名实例对象,与类对象不是一个.(需要区分清楚).
		3.类对象中包含该类的属性,方法,构造函数,父类,父接口,注解等信息,

获取类对象的方式

方式1
	通过类的实例对象获取类对象
		实例对象.getClass();
方式2
	通过类名获取类对象
	类名.class
方式3
	通过Class类提供的静态方法获取
	Class.forname("包名.类名");
	
三种方式实际使用:	
		/**
		 * 方式1
		 *	通过类的实例对象获取类对象
		 *	实例对象.getClass();
		 */
		Student student = new Student();
		Class class1 = student.getClass();
		/**
		 * 方式2
		 *	通过类名获取类对象
		 *	类名.class
		 */
		Class class2= Student.class;
		/**
		 * 方式3
		 *	通过Class类提供的静态方法获取
		 *	Class.forname("包名.类名");
		 */
		Class class3 = Class.forName("com.jlf.getclass.Student");

类对象的常用方法

概述:
	获取该类的信息:
        获取类的全名称(包名+类名)
            String name = class3.getName();
        获取类加载器
            ClassLoader loader = class3.getClassLoader();
        获取父类
            Class superclass = class3.getSuperclass();
        获取父接口(接口可以多个)
            Class[] interfaces = class3.getInterfaces();
        获取其包
            Package package1 = class3.getPackage();
            package1.getName();
        通过类对象创建类的实例对象
                /**
                 * 类对象.newInstance();
                 * 	调用的是无参构造
                 * 注意:
                 * 		1.如果该类中没有无参构造函数,
                 * 		此时方法会发生异常:NoSuchMethodExceptiom
                 *		2.如果该类无参构造的访问权限修饰符不足
                 *		此时该方法将出现异常IllegalAccessException
                 */
                Object object = class3.newInstance();
                Student student = (Student)object;


        获取属性:
            Filed
            	/**
                 * 获取类的所有公共属性
                 *	可以获取到父类的公共属性
                 */
                Field[] fields = class1.getFields();
                /**
                 * 获取类的所有属性
                 * 只能获取本类的所有属性
                 */
                Field[] fields2 = class1.getDeclaredFields();
                	//获取指定属性
				Field field = class1.getDeclaredField("name");
				//参数:指定的属性名
                //略过访问权限修饰符
				field.setAccessible(true);

        获取构造函数
            
          	获取公共构造函数
            	Constructor[] constructors = class1.getConstructors();

			获取所有构造函数
                Constructor[] constructors2 = class1.getDeclaredConstructors();
		
         	获取指定构造函数(只有与参数不同)
                Constructor<Student> constructor01 = class1.getDeclaredConstructor(参数列表的类对象列表);
			eg://获取两/三参构造函数
		Constructor<Student> constructor02 = class1.getDeclaredConstructor(String.class,String.class,String.class);
		

        获取方法:
            获取公共方法
            	//获取所有公共方法(包括父类和父接口提供的方法)
				Method[] methods = c.getMethods();
            获取所有方法
                //只能获取本类所有方法
				Method[] methods2 = c.getDeclaredMethods();
            获取指定方法
            	 Method  getDeclaredMethod(String name,... p)
                参数一:方法名
                参数二:该方法形参列表对应的类对象列表
        eg:Method m2 = c.getDeclaredMethod("setAge",String.class);
		
		获取注解
            

Filed(属性)

常用方法
	修改对象属性值
		void set(对象,修改后的值)
	//略过访问权限修饰符
		field.setAccessible(true);
	获取对象属性的值
		Object get()
	//获取指定属性
		Field field = class1.getDeclaredField("指定的属性名");

Constructor(构造函数)

常用方法:
    //通过构造函数创建对象		
    newInstance(实参列表);
            eg:
            Student student2 = constructor02.newInstance("18","焦龙飞","男");	
    //忽略访问权限修饰符
    void setAccessible(true);

Method(方法)

常用方法:
    //忽略访问权限修饰符
    void setAccessible(true);
    //执行方法
    Object invoke(Object obj, Object... args)
      执行方法
      m2:方法
      s1:执行m2方法的列表
      m2.invoke(s1 );
				
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值