您的位置:首页 > 其它

浅谈反射机制(一)

2017-05-10 13:24 357 查看
今天我来说一下在Java里面是反射机制。通俗的讲就是根据一个对象去找该对象所在的包和类。平常我们编写Java程序的时候都是创建一个类,然后再去new出该类的对象。而反射机制刚好是相反的。截图如下:

要学反射机制首先就要学好Object中的getClass()这个方法。首先先看一下jdk帮助文档里面的有关方法:



要注意到getClass()方法前面有一个final关键字,final关键字在这里的作用就是其他类去继承Object,但不能去重写getClass()方法

例如以下程序就用到了反射机制:

package com.cal.demo;

public class Demo{

public static void main(String[] args){

Student s = new Student();

System.out.println(s.getClass().getName());

}

}

class Student{}

结果是:com.cal.demo.Student

 

获取反射机制有三种方式:

例如一下代码:

package com.cal.demo;

public class Demo{

public static void main(String[] args){

Class<?> c1 = null;

Class<?> c2 = null;

Class<?> c3 = null;

try{

c1 = Class.forName("com.cal.demo.Student");

}catch(Exception){

e.printStackTrace();

}

c2 = new Student().getClass();//通过Object类中的方法实例化

c3 = Student.class;//通过类.class实例化

System.out.println(c1.getName());

System.out.println(c2.getName());

System.out.println(c2.getName());

}

}

class Student{}

这三种方式返回的结果都一样,都是:com.cal.demo.Student

通过无参构造方法实例化对象

package com.cal.demo;

public class instance{

public static void main(String[] args){

Class<?> c = null;

try{

c = Class.forName("com.cal.demo.Student");

}catch(Exception e){

e.printStackTrace();

}

Student s = new Student();

try{

s = (Student)c.newInstance();

}catch(Exception e){

e.printStackTrace();

}

s.setName("伍金凡");

s.setAge(10);

System.out.println(s);

}

}

class Student{

private String name;

private int  age;

public void setName(String name){

this.name=name;

}

public String getName(){

return name;

}

public void setAge(int age){

this.age=age;

}

public int getAge(){

return age;

}

public String toString(){

return "姓名:"+this.name+",年龄:"+this.age+"";

}

}

我来解释一下这里:

首先Student类,这里面就是两个属性,以及默认的无参构造函数,set和get方法

然后就是main里面的代码了。

Class<?> c = null;

try{

c = Class.forName("com.cal.demo.Student");

}catch(Exception e){

e.printStackTrace();

}

Student s = new Student();

try{

s = (Student)c.newInstance();

}catch(Exception e){

e.printStackTrace();

}

其实这些操作就是取代了之前的new关键字
Class<?> c = null;这是指定一个泛型

try{

c = Class.forName("com.cal.demo.Student");

}catch(Exception e){

e.printStackTrace();

}找到所在的类

Student s = new Student();//声明一个Student对象

try{

s = (Student)c.newInstance();

}catch(Exception e){

e.printStackTrace();

}实例化Student对象

通过有参构造方法实例化对象

package com.cal.demo;

public class Instance{

public static void main(String[] args){

Class<?> c =null;

try{

c = Class.forName(com.cal.demo.Student);

}catch(Exception e){

e,printStackTrace();

}

Student s=null;

Constructor<?> cons[] = null;

cons = c.getConstructors();

try{}catch(Exception e){

s = (Student)cons[0].newInstance("伍金凡",10);

}catch(Exception e){

e.printStackTrace();

}

System.out.println(s);

}

}

class Student{

private String name;

<
4000
span style="white-space:pre;">private int age;

public void setName(String name){

this.name=name;

}

public String getName(){

return name;

}

public void setAge(){

this.age=age;

}

public int getAge(){

return age;

}

public Student(String name,int age){

this.setName(name);

this.setAge(age);

}

public String toString(){

return "姓名:"+this.name+",年龄:"+this.age+"";

}

}

这里声明了一个构造方法的数组

并且cons = c.getConstructors();获取Student所有的构造方法。 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  class 对象 继承 string