JavaRush /Курсы /All lectures for AM purposes /getClass() մեթոդը, օբյեկտ դասը, ծանոթացում Reflection-ի հ...

getClass() մեթոդը, օբյեկտ դասը, ծանոթացում Reflection-ի հետ

All lectures for AM purposes
1 уровень , 196 лекция
Открыта
getClass() մեթոդը, օբյեկտ դասը, ծանոթացում Reflection-ի հետ - 1

— Բարև, Ամիգո՛:

Հիմա ամենահետաքրքիրը։ Մենք կծանոթանանք Class դասի հետ, և մի քիչ էլ Reflection-ի հետ:
Ինչպես երևի թե արդեն հասկացար, Java-ում ամեն ինչ օբյեկտ է։ Իսկ ի՞նչ է պետք օբյեկտի համար։ Ի՞նչ կա յուրաքանչյուր օբյեկտի մեջ և որոշում է նրա բնույթը:

— Օբյեկտի դասը:

— Ճիշտ է։ Ամեն օբյեկտ ունի դաս։ Բայց վերադառնանք օբյեկտներին։ Որոշ օբյեկտները ամբողջությամբ պարունակում են որևէ էություն, իսկ մյուսները պարզապես օգնում են նրան կառավարել:

Վերջիններին կարելի է դասել FileOutputStream կամ Thread: Երբ ստեղծում ես Thread օբյեկտը, նոր թել չի ստեղծվում։ Այն ստեղծում է Java մեքենան start() մեթոդի կանչից հետո։ Այս օբյեկտը պարզապես օգնում է կառավարել պրոցեսը:

Այնպես էլ FileOutputStream: ֆայլը պահվում է սկավառակի վրա, և դրա պահեստավորումն ու հասանելիությունը կառավարում է ՕՀ-ն։ Բայց մենք կարող ենք գործ ունենալ դրա հետ File տիպի օբյեկտների միջոցով, կրկին Java մեքենայի օգնությամբ:

— Այո, դա ես արդեն հասկացել եմ:

— Ուրեմն, դասերի հետ փոխգործակցելու համար կա հատուկ դաս, որը կոչվում է — Class:

— Չէի կասկածում:

— Բայց այո։ Ամեն անգամ, երբ Java մեքենան ներբեռնում է հիշողության նոր դաս, նա ստեղծում է Class տիպի օբյեկտ, որով կարող է որոշակի ինֆորմացիա ստանալ ներբեռնված դասի մասին:

Յուրաքանչյուր դասին և օբյեկտին կցված է այդպիսի «դասի օբյեկտ»:

Օրինակ Նկարագրություն
Class clazz = Integer.class;
«Դասի օբյեկտ» ստացվելում Integer դասից:
Class clazz = int.class;
«Դասի օբյեկտ» ստացվելում int դասից:
Class clazz = "123".getClass();
«Դասի օբյեկտ» ստացվելում String տիպի օբյեկտից:
Class clazz = new Object().getClass();
«Դասի օբյեկտ» ստացվելում Object տիպի օբյեկտից:

— Վայ, ինչ հետաքրքիր է:

Բայց ինչու ես գրում clazz, և ոչ class?

— Հիշո՞ւմ ես, որ class բառը Java-ում հիմնական բառ է, և օգտագործել այն որպես փոփոխականի անուն չի կարելի:

— Այո, գիտեմ, գիտեմ։ Պարզապես մոռացա։

— Դու որևէ տեղ արդեն օգտագործե՞լ ես Class-ի օբյեկտը:

— Այո, մենք օգտագործել ենք, երբ գրել ենք equals մեթոդի մեր իրագործումը:

— Այո, կարելի է համեմատել — նույն դասերն արդյո՞ք ունեն օբյեկտները, եթե օգտագործել getClass() մեթոդը:

— Իսկ ինչ կարելի է անել այդ օբյեկտով?

— Դե, շատ բան:

Java կոդ Նկարագրություն
Class s = int.class;
String name = s.getName();
Ստանալ դասի անունը։
Class s = Class.forName("java.lang.String");
Ստանալ դաս անունով։
Object o1 = String.valueOf(1);
Object o2 = 123 + "T";
o1.getClass() == o2.getClass();
Համեմատել դասերը օբյեկտների մեջ:

— Հետաքրքիրը, բայց ոչ այնքան կուրտ, ինչպես ես մտածում էի:

— Ուզո՞ւմ ես, որ լինի կուրտ: Կա ևս մի բան՝ Reflection: Reflection - սա շատ կուրտ է:

— Իսկ ի՞նչ է Reflection:

Reflection - սա դասի ունակությունն է ստանալու ինֆորմացիա իր մասին: Java-ում կան հատուկ դասեր, Field - դաշտ, Method - մեթոդ, ինչպես Class դասերի համար: Ե. այդ դեպքում Class տիպի օբյեկտը տալիս է հնարավորություն ստանալ ինֆորմացիա դասի մասին, այն դեպքում Field-ի մասին՝ դաշտի, իսկ Method-ի մասին՝ մեթոդի մասին։ Եվ ահա՝ ինչ կարելի է անել նրանց հետ.

Java կոդ Նկարագրություն
Class[] interfaces = List.class.getInterfaces();
Ստանում ենք «դասի օբյեկտները» List դասի ինտերֆեյսների համար:
Class parent = String.class.getSuperclass();
Ստանում ենք «դասի օբյեկտը» String դասի ծնող դասի համար:
Method[] methods = List.class.getMethods();
Ստանում ենք մեթոդների ցանկը, որոնք կան List դասում:
String s = String.class.newInstance();
Ստեղծում ենք նոր String դասի օբյեկտ:
String s = String.class.newInstance();
Method m = String.class.getMethod("length");
int length = (int) m.invoke(s);
Ստանում ենք length մեթոդը String դասի համար, կանչում այն s տողի համար:

— Վայ։ Սա իրականում կուրտ է։

— Ուրախ եմ, որ քեզ դուր եկավ։

Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ